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

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

项目结构如下

scrapy + seleuimn + chromedriver爬虫,解决header和cookie问题_第1张图片

一、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/

你可能感兴趣的:(爬虫,爬虫,scrapy,python)