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、部分截图

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web安全工具库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值