scrapy + seleuimn + chromedriver爬虫,解决header和cookie问题

爬取网站的时候,有时候会遇到前后端分离这类型的网站,这种网站的前端需要通过浏览器解析后才能显示,这里通过seleuimn的方式来解析这类型网站。

项目结构如下

一、scrapy 配置使用 seleuimn

1、安装 seleuimn (参见官网:Install a Selenium library | Selenium

pip install selenium

2、下载chrome driver (Install browser drivers | Selenium),解压放置drivers目录

3、打开setting文件,启动中间件,将以下代码取消注释(使用默认的中间件)

DOWNLOADER_MIDDLEWARES = {
   'spiderDemo.middlewares.SpiderdemoDownloaderMiddleware': 543,
}

4、打开 meddlewares.py 文件,编写下载中间件代码,重写process_request 方法

注意:(以下代码设置 header 和cookie,都是通过chromedriver来设置的;使用scrapy 框架设置header和 cookie  发现失效

def process_request(self, request, spider):
    cookies = {
        "name": "ttwid",
        "value": "1%7CzwytjozFPepsan0vF8klB9w8oJGCPEVIVzu7ooqMUnM%7C1658237699%7C1fd22eb71471fe13f1d6cddf4f0f54b9f12260d5051eb0c04099be160e6ae9bd"
    }
    exePath = ".\scrapytest\drivers\chromedriver.exe"
    options = webdriver.ChromeOptions()
    options.add_argument(
        'user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36"')
    options.add_argument('--headless')  # 无界面运行
    driver = webdriver.Chrome(executable_path=exePath, options=options)
    driver.get(request.url)
    driver.add_cookie(cookie_dict=cookies)
    driver.get(request.url)
    driver.implicitly_wait(5)
    content = driver.page_source
    driver.quit()
    return HtmlResponse(request.url, encoding="utf-8", body=content, request=request)

5、编写爬虫程序

import scrapy

class DemoSpider(scrapy.Spider):
    name = "spider_test"

    def start_requests(self):
        urls = [
            'https://www.toutiao.com/article/7108301511255441932/?log_from=43a18f2b4d7cc_1658325693599'
        ]

        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response, **kwargs):
        print("====================  body is :  =======================")
        print(response.body)
        filename = "test.html"
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log(f'Saved file {filename}')

6、运行爬虫

scrapy crawl spider_test

二、seleiumn 浏览器常用设置

# 无界面模式
options.add_argument('--headless')

# 指定用户客户端-模拟手机浏览
options.add_argument('user-agent="MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"')

options.add_argument('--disable-infobars') # 禁止策略化
options.add_argument('--no-sandbox') # 解决DevToolsActivePort文件不存在的报错
options.add_argument('window-size=1920x3000') # 指定浏览器分辨率
options.add_argument('--disable-gpu') # 谷歌文档提到需要加上这个属性来规避bug
options.add_argument('--incognito') # 隐身模式(无痕模式)
options.add_argument('--disable-javascript') # 禁用javascript
options.add_argument('--start-maximized') # 最大化运行(全屏窗口),不设置,取元素会报错
options.add_argument('--disable-infobars') # 禁用浏览器正在被自动化程序控制的提示
options.add_argument('--hide-scrollbars') # 隐藏滚动条, 应对一些特殊页面
options.add_argument('blink-settings=imagesEnabled=false') # 不加载图片, 提升速度

更多参数,详见:List of Chromium Command Line Switches « Peter Beverloo

三、seleiumn chromedriver添加cookie

driver.add_cookie({"name": "key", "value": "value"})

添加cookie 详见官网地址:Working with cookies | Selenium

四、seleium 使用详见官方文档

https://www.selenium.dev/documentation/overview/

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您的问题是关于如何基于PythonScrapy、Redis和Rule组件实现分布式爬虫爬取京东华为笔记本的。首先,您需要安装Scrapy和Redis,并在Scrapy的配置文件中添加Redis相关的配置: ```python # 在settings.py中添加以下配置 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" SCHEDULER = "scrapy_redis.scheduler.Scheduler" SCHEDULER_PERSIST = True REDIS_URL = 'redis://localhost:6379' ``` 然后,您需要编写Spider和Item Pipeline,其中Spider负责解析并抓取网页,Item Pipeline负责处理抓取到的数据。下面是一个示例的Spider代码: ```python from scrapy_redis.spiders import RedisSpider from scrapy.selector import Selector from ..items import ProductItem class JdSpider(RedisSpider): name = 'jd' redis_key = 'jd:start_urls' def parse(self, response): sel = Selector(response) products = sel.xpath('//div[@class="gl-i-wrap"]') for product in products: item = ProductItem() item['name'] = product.xpath('div[@class="p-name"]/a/em/text()').extract_first() item['price'] = product.xpath('div[@class="p-price"]/strong/i/text()').extract_first() item['url'] = product.xpath('div[@class="p-name"]/a/@href').extract_first() yield item ``` 在Item Pipeline中,您可以对抓取到的数据进行清洗和存储,下面是一个示例的Item Pipeline代码: ```python import pymongo class JdPipeline(object): def __init__(self, mongo_uri, mongo_db): self.mongo_uri = mongo_uri self.mongo_db = mongo_db @classmethod def from_crawler(cls, crawler): return cls( mongo_uri=crawler.settings.get('MONGO_URI'), mongo_db=crawler.settings.get('MONGO_DATABASE', 'items') ) def open_spider(self, spider): self.client = pymongo.MongoClient(self.mongo_uri) self.db = self.client[self.mongo_db] def close_spider(self, spider): self.client.close() def process_item(self, item, spider): self.db['products'].insert(dict(item)) return item ``` 最后,您需要创建一个Redis队列,并向队列中添加起始URL,如下所示: ```python import redis r = redis.Redis(host='localhost', port=6379) r.lpush('jd:start_urls', 'https://search.jd.com/Search?keyword=%E5%8D%8E%E4%B8%BA%E7%AC%94%E8%AE%B0%E6%9C%AC&enc=utf-8') ``` 最终,您就可以运行分布式爬虫并抓取京东华为笔记本的数据了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值