有时候可能会爬取一些有二级链接的链接
找了一下常用的网站,发现豆瓣还是很好爬的,点开电影名会显示详细的电影信息,符合即将完成工作的需要
这种的爬取方式将会在下面进行介绍
1 基本情况介绍
要爬取的链接是https://movie.douban.com/top250
打开之后的界面如下图所示:
点击电影名可以进到电影的详细信息界面
2 确定要爬取内容的dom结构
- 确定要爬取的二级链接的xpath
也就是要去寻找二级链接的那个 href
可以看到 在div的class的item下面,在第二个字目录,也就是div的class为hd的下面,就有a,里面的href就是我们需要的
这里的xpath为//div[@class=‘item’]//div[@class=‘hd’]/a/@href
⚠️⚠️。这个item后面有两个斜杠,一个斜杠代表子目录,两个代表其所有的子孙目录
- 确定要爬取内容的xpath
接下来的任务是找到详情页面要爬取内容的xpath,这里只爬取标题
这个很好找,一级标题h1下面的span里面的内容就是要爬取的内容
所以确定一级标题的xpath为://h1/span/text()
3. 新建dou ban.py来写爬虫代码
这里请求的时候需要使用yield函数
这里我们通过 yield 来发起一个请求,并通过 callback 参数为这个请求添加回调函数,在请求完成之后会将响应作为参数传递给回调函数
我们在循环里使用了yield函数,这里是在循环里不断提取电影详情界面的链接,并且通过yield来发起请求,并且还将parse_detail作为回调函数从响应中提取所需的数据。
那这样的话 还需要写一个parse_detail来解析二级链接里面的内容
代码大概就是下面这样子
上代码:
# -*- coding: utf-8 -*-
import scrapy
from scrapy import Request
class DoubanSpider(scrapy.Spider):
name = 'douban'
allowed_domains = ['movie.douban.com']
start_urls = ['https://movie.douban.com/top250/']
def parse(self, response):
movies = response.xpath("//div[@class='item']")
for movie in movies:
detail_url=movie.xpath(".//div[@class='hd']/a/@href").get()
# print(detail_url)
yield Request(url=detail_url,callback=self.parse_detail)
def parse_detail(self, response):
title = response.xpath("//h1/span/text()").get()
print(title)
4 运行代码,爬取需要结果
运行后的截图如下:
综上,带有链接的爬虫over?
感谢颖硕给予的帮助 让我少踩很多坑?