一、深度爬取
深度爬取是指在网络爬虫中,获取网页上的所有链接并递归地访问这些链接,以获取更深层次的页面数据。
通常,一个简单的爬虫只会获取到初始页面上的链接,并不会进一步访问这些链接上的其他页面。而深度爬取则会不断地获取链接,并继续访问这些链接上的页面,直到达到设定的深度限制或者没有更多的链接可供访问为止。这样可以更全面地获取网页上的数据,并且可以发现更多的链接。但是需要注意的是,深度爬取需要谨慎操作,以免对目标网站造成过大的负载。
二、爬取豆瓣电影的电影链接中的数据
比如点开下列页面中的链接得到另一个页面,而另一个页面就有很多新的数据,就可以爬取更多的东西,当然了,点开后的链接也可以下次爬取,只需要对爬到的URL再次进行发送get请求即可。
点开蓝色选中的链接得到关于这个电影的全部信息:
上图中所有的数据都可以爬取,下面我们就演示一下对电影目录一整页的数据进行深度爬取
三、实战爬取整页电影目录的数据
1、获取这一整页电影的所有URL:
经过前面几节课,我们也都学习了怎么样去获取网页信息,因为这些电影都是存放在一个列表里的(在点击网络-元素-在网页中选择一个元素检查的标识,当选中网页中可以看到各个板块的排列位置),或者也可以在‘元素’里看到当前页面电影信息都存放在li标签下,所以可以通过下列图片得到单个电影的URL,下面代码部分就是爬取到了所有电影的URL了:
import requests
from lxml import etree
import fake_useragent
if __name__ == '__main__':
head={
'User-Agent':fake_useragent.UserAgent().random #随机生成一个UA标识
}
#获取当前页面的URL
url='https://movie.douban.com/top250'
#发送get请求
response=requests.get(url,headers=head)
#返回获取到的页面源码
lxml_info=response.text
#解析获取到的信息
tree=etree.HTML(lxml_info)
#利用xpath定位到所有电影存放的标签下
film=tree.xpath('//ol[@class="grid_view"]/li')
#对获取到的所有li标签进行遍历循环
for li in film:
#当前位置在li标签,用xpath读取到电影链接,再通过join去除括号
film_url="".join(li.xpath('./div/div[2]/div[1]/a/@href'))
print(film_url)
2、爬取链接内的页面信息
通过上一步我们已经得到所有电影的URL了,那么下一步则是对这些URL继续进行get请求:
for li in film:
#当前位置在li标签,用xpath读取到电影链接,再通过join去除括号
film_url="".join(li.xpath('./div/div[2]/div[1]/a/@href'))
#对获取到的URL发送get请求
res=requests.get(film_url,headers=head)
#打印请求到的信息
res_t=res.text
获取到电影页面信息后我们继续像上部一样对这段数据进行处理,即以下代码:
res_t=res.text
# print(res_t)
#解析获取到的信息
tree_url=etree.HTML(res_t)
#定位到所需要信息的位置,比如我们要爬取他的剧情简介
#首先是电影名称
fil_name="".join(tree_url.xpath('//body/div[3]/div[1]/h1/span[1]/text()'))
#其次是电影的简介内容
#因为此处有两种类型的电影简介标签位置span[1]和span[2],所以做一个判断,如果电影1有内容那么打印电影1,反之打印电影2
if "".join(tree_url.xpath('//div[@class="related-info"]/div[1]/span[2]/text()')):
print(fil_name)
print("".join(tree_url.xpath('//div[@class="related-info"]/div[1]/span[2]/text()')).strip())
else:
film_jianjie = "".join(tree_url.xpath('//div[@class="related-info"]/div[1]/span[1]/text()'))
print(fil_name)
print(film_jianjie.strip())
注意:此处做了一个判断,因为其中电影的标签存放位置略有不同,即span[1]和span[2]
如下图肖申克的救赎,其简介存放在标签span[2]下,而霸王别姬存放在span[1]下:
霸王别姬如下:
3、完整代码如下:
import requests
from lxml import etree
import fake_useragent
if __name__ == '__main__':
head={
'User-Agent':fake_useragent.UserAgent().random #随机生成一个UA标识
}
#获取当前页面的URL
url='https://movie.douban.com/top250'
#发送get请求
response=requests.get(url,headers=head)
#返回获取到的页面源码
lxml_info=response.text
#解析获取到的信息
tree=etree.HTML(lxml_info)
#利用xpath定位到所有电影存放的标签下
film=tree.xpath('//ol[@class="grid_view"]/li')
#对获取到的所有li标签进行遍历循环
for li in film:
#当前位置在li标签,用xpath读取到电影链接,再通过join去除括号
film_url="".join(li.xpath('./div/div[2]/div[1]/a/@href'))
#对获取到的URL发送get请求
res=requests.get(film_url,headers=head)
#打印请求到的信息
res_t=res.text
# print(res_t)
#解析获取到的信息
tree_url=etree.HTML(res_t)
#定位到所需要信息的位置,比如我们要爬取他的剧情简介
#首先是电影名称
fil_name="".join(tree_url.xpath('//body/div[3]/div[1]/h1/span[1]/text()'))
#其次是电影的简介内容
#因为此处有两种类型的电影简介标签位置span[1]和span[2],所以做一个判断,如果电影1有内容那么打印电影1,反之打印电影2
if "".join(tree_url.xpath('//div[@class="related-info"]/div[1]/span[2]/text()')):
print(fil_name)
print("".join(tree_url.xpath('//div[@class="related-info"]/div[1]/span[2]/text()')).strip())
else:
film_jianjie = "".join(tree_url.xpath('//div[@class="related-info"]/div[1]/span[1]/text()'))
print(fil_name)
print(film_jianjie.strip())
另外可以在后面加一条创建新文件的代码用来存放这些数据,已达到获取信息存放到本地保存的目的。