Scrapy框架结合selenium获取动态加载数据

2023-06-0917:48:34云计算与物联网Comments1,409 views字数 2115阅读模式

一、新建一个Scrapy项目wangyi,进入该项目,创建wangyipc爬虫文件文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46400.html

scrapy startproject wangyi
cd wangyi
scrapy genspider wangyipc www.xxx.com

二、修改settings文件文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46400.html

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"

三、获取这四个板块的响应内容文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46400.html

Scrapy框架结合selenium获取动态加载数据
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://www.cainiaoxueyuan.com/yunda/46400.html

国内 https://news.163.com/domestic/
国际 https://news.163.com/world/
军事 https://war.163.com/
航空 https://news.163.com/air/

四、由于新闻的详细信息是动态加载,所以我们需要结合selenium来进行操作文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46400.html

1、导入浏览器驱动文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46400.html

Scrapy框架结合selenium获取动态加载数据

2、在爬虫文件创建浏览器对象文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46400.html

from selenium import webdriver
浏览器对象=webdriver.Chrome(executable_path='../../chromedriver.exe')

3、通过中间操作文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46400.html

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、开启中间件文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46400.html

DOWNLOADER_MIDDLEWARES = {
   "wangyi.middlewares.WangyiDownloaderMiddleware": 543,
}

5、爬虫文件完成最后解析文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46400.html

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添加对象文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46400.html

标题 = scrapy.Field()
    内容 = scrapy.Field()

7、管道文件操作文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46400.html

class WangyiPipeline:
    def process_item(self, item, spider):
        print(item)
        return item

8、开启管道文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46400.html

ITEM_PIPELINES = {
   "wangyi.pipelines.WangyiPipeline": 300,
}

9、关闭浏览器对象文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46400.html

def closed(self, reason):
        self.浏览器对象.quit()

10、运行爬虫文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46400.html

scrapy crawl wangyipc

11、部分截图文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46400.html

Scrapy框架结合selenium获取动态加载数据
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46400.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/yunda/46400.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定