根据项目修改爬虫代码,以及爬虫进阶(翻页、深度获取、保存)

1.修改项目以适应新的爬虫情景

(1)修改pachong文件里面的 start_urls 网址

(2)修改items文件里面的需要爬取的指标名称 XX = scrapy.Field()

(3)修改xpath路径 li_list 和 item["XX"]

基础爬虫代码 ↓ 

import scrapy
from ..items import PcItem
#手动新增调用,记得是自己项目的名字pc加上Item,和items文件里面保持一致,会自动弹出


class DoubanSpider(scrapy.Spider):
    name = "douban"
    allowed_domains = ["movie.douban.com"]
    start_urls = ["修改为具体网址"]

    def parse(self, response):
        item=PcItem()
        # PcItem是自己的爬虫项目名称,跟item文件对应,如果名字换了,pc就换成别的,item不变
        li_list = response.xpath('//*[@id="content"]/div/div[1]/ol/li')
        # name
        # //*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/span[1]
        # //*[@id="content"]/div/div[1]/ol/li[2]/div/div[2]/div[1]/a/span[1]
        # 评分
        # //*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[2]/div/span[2]
        # //*[@id="content"]/div/div[1]/ol/li[3]/div/div[2]/div[2]/div/span[2]
        # 简介
        # //*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[2]/p[2]/span
        # //*[@id="content"]/div/div[1]/ol/li[2]/div/div[2]/div[2]/p[2]/span
        for li in li_list:
            item["name"] = li.xpath("./div/div[2]/div[1]/a/span[1]/text()").get()
            item["pingfen"] = li.xpath("./div/div[2]/div[2]/div/span[2]/text()").get()
            item["jianjie"] = li.xpath("./div/div[2]/div[2]/p[2]/span/text()").get()
            yield item

2. 翻页获取

(1)先注销上面的原始start_url

(2)使用 range 翻页,构建新的url,注意不可以再命名为start_url

class DoubanSpider(scrapy.Spider):
    name = "douban"
    allowed_domains = ["movie.douban.com"]
    # start_urls = ["https://movie.douban.com/top250"]

    # 先注销上面的原始start_url
    def start_requests(self):
        for page in range(3):
            yield scrapy.Request(url=f"https://movie.douban.com/top250?start={page * 25}&filter=")

(3)其他的都不需要改动,但是在这一步出现了一个报错

ImportError: cannot import name 'COMMON_SAFE_ASCII_CHARACTERS' from 'charset_normalizer.constant' (D:\anaconda3\envs\fenghuang\lib\site-pa ckages\charset_normalizer\constant.py)

# 解决方案
pip install chardet

3.翻页获取 方法2

(1)拿到基础的爬虫代码不需要修改

(2)增加“点击下一页”这一行为对应的代码

(3)写在 def 里面,和 for 循环平级

(4)逻辑是寻找“下一页”对应的xpath路径,如果找到,就把对应的下一页链接转到前面定义的parse里面再跑一遍,不断循环,知道没有“下一页”的链接。

import scrapy
from requests import Request
from ..items import PcItem

class DoubanSpider(scrapy.Spider):
    name = "douban"
    allowed_domains = ["movie.douban.com"]
    start_urls = ["https://movie.douban.com/top250"]

    def parse(self, response):
        li_list = response.xpath('//*[@id="content"]/div/div[1]/ol/li')
        for li in li_list:
            item = PcItem()
            item['name'] = li.xpath('./div/div[2]/div[1]/a/span[1]/text()').get()
            item['pingfen'] = li.xpath('./div/div[2]/div[2]/div/span[2]/text()').get()
            item['jianjie'] = li.xpath('./div/div[2]/div[2]/p[2]/span/text()').get()
            yield item  # 将每个电影信息 yield 出来

        # 另一种方法,可以保持前面的不变,然后构建next_url,获取下一页链接并跟进
        next_url = response.xpath('//*[@id="content"]/div/div[1]/div[2]/span[@class="next"]/a/@href').get()
        # 点击下一页对应的路径 //*[@id="content"]/div/div[1]/div[2]/span[3]/a
        if next_url:  # 如果找到这个url
            yield response.follow(url=next_url, callback=self.parse)
            # 将url返回到“parse”程序处理数据follow=True

4. 深度获取

(1)希望获取原始网页的变量1,然后依次点击进去原始网页的不同链接,获取变量2,然后回到原网页

(2)目前的结果有点乱,点进去之后就没出来,继续修改ing

class DoubanSpider(scrapy.Spider):
    name = "douban"
    allowed_domains = ["movie.douban.com"]
    start_urls = ["https://movie.douban.com/top250"]

    def parse(self, response):
        item=PcItem()
        li_list = response.xpath('//*[@id="content"]/div/div[1]/ol/li')
        for li in li_list:
            item["name"] = li.xpath("./div/div[2]/div[1]/a/span[1]/text()").get()
            item["pingfen"] = li.xpath("./div/div[2]/div[2]/div/span[2]/text()").get()
            item["jianjie"] = li.xpath("./div/div[2]/div[2]/p[2]/span/text()").get()
            # yield item
            # 注销结束代码,加上需要获取的深度指标的路径
            shendu_url = li.xpath('./div/div[2]/div[1]/a/@href').get()
            # 在当前界面找到能够点击进入的链接位置,并复制其xpath路径
            # //*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a
            # 发现其路径的前半部分和抓取名字、评分等都是一样的,那么根据后面的部分构建深度链接
            # 现在我们要获取的是链接不是文本,所以要把text()换成@href

            yield scrapy.Request(url=shendu_url,callback=self.parse_detail,meta={"item":item})
            # callback=self.parse_detail(下一步新的变量名),meta(保存)={“item”:item}
            # 结束代码,但跟之前的结束不一样
            # 需要携带获取的内容返回到“parse_detail"处理深度获取的页面数据
            # 上述的代码,只需要把url=shendu_url,改为任意我们想要的数据名称即可,shendu_url或者其他

    # 构建一个新的循环,来获取深度界面的内容
    def parse_detail(self, response):
        item = response.meta['item']
        # 接收由meta函数携带的数据
        li_list = response.xpath('//*[@id="recommendations"]/div/dl/dd')
        # //*[@id="recommendations"]/div/dl[1]/dd/a
        # //*[@id="recommendations"]/div/dl[2]/dd/a
        # 新页面获取数据对应的xpath路径

        item['tuijian'] = []
        # 为“tuijian”创建一个列表,储存获取的数据
        for li in li_list:
            item['tuijian'].append(li.xpath('./a/text()').get())
            # 将获取的单个数据由“append”函数传送进创建的列表
            yield item

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值