爬取网站的时候,有时候会遇到前后端分离这类型的网站,这种网站的前端需要通过浏览器解析后才能显示,这里通过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
# 无界面模式
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
driver.add_cookie({"name": "key", "value": "value"})
添加cookie 详见官网地址:Working with cookies | Selenium
https://www.selenium.dev/documentation/overview/