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