Scrapy框架结合selenium获取动态加载数据
一、新建一个Scrapy项目wangyi,进入该项目,创建wangyipc爬虫文件
scrapy startproject wangyi
cd wangyi
scrapy genspider wangyipc www.xxx.com
二、修改settings文件
ROBOTSTXT_OBEY = False
LOG_LEVEL = 'ERROR'
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"
三、获取这四个板块的响应内容

start_urls = ["https://XXXX.com/"]
板块链接=[]
def parse(self, response):
板块下标=[1,2,4,5]
板块列表=response.xpath('//*[@id="index2016_wrap"]/div[3]/div[2]/div[2]/div[2]/div/ul/li')
for i in 板块下标:
板块链接=板块列表[i].xpath('./a/@href').extract_first()
板块名字=板块列表[i].xpath('./a/text()').extract_first()
self.板块链接.append(板块链接)
print(板块名字,板块链接)
运行结果:
国内 https://news.163.com/domestic/
国际 https://news.163.com/world/
军事 https://war.163.com/
航空 https://news.163.com/air/
四、由于新闻的详细信息是动态加载,所以我们需要结合selenium来进行操作
1、导入浏览器驱动

2、在爬虫文件创建浏览器对象
from selenium import webdriver
浏览器对象=webdriver.Chrome(executable_path='../../chromedriver.exe')
3、通过中间操作
def process_response(self, request, response, spider):
板块链接=spider.板块链接
if request.url in 板块链接:
浏览器对象=spider.浏览器对象
浏览器对象.get(request.url)
sleep(1)
网页内容=浏览器对象.page_source
response=HtmlResponse(url=request.url,request=request,encoding='utf8',body=网页内容)
return response
else:
return response
4、开启中间件
DOWNLOADER_MIDDLEWARES = {
"wangyi.middlewares.WangyiDownloaderMiddleware": 543,
}
5、爬虫文件完成最后解析
for u in self.板块链接:
yield scrapy.Request(url=u,callback=self.详情页解析)
def 详情页解析(self,response):
新闻列表=response.xpath('/html/body/div[1]/div[3]/div[3]/div[1]/div[1]/div/ul/li/div/div')
for i in 新闻列表:
try:
标题=i.xpath('./div/div[1]/h3/a/text()').extract_first()
详情页 = i.xpath('./div/div[1]/h3/a/@href').extract_first()
item对象=WangyiItem()
item对象['标题']=标题
#print(标题, 详情页)
except Exception as e:
print("爬虫问题")
if 详情页!=None:
yield scrapy.Request(url=详情页,callback=self.新闻内容,meta={'item':item对象})
def 新闻内容(self,response):
item=response.meta['item']
内容=response.xpath('//*[@id="content"]/div[2]//text()').extract()
内容=''.join(内容).strip()
item['内容']=内容
yield item
6、items添加对象
标题 = scrapy.Field()
内容 = scrapy.Field()
7、管道文件操作
class WangyiPipeline:
def process_item(self, item, spider):
print(item)
return item
8、开启管道
ITEM_PIPELINES = {
"wangyi.pipelines.WangyiPipeline": 300,
}
9、关闭浏览器对象
def closed(self, reason):
self.浏览器对象.quit()
10、运行爬虫
scrapy crawl wangyipc
11、部分截图

THE END