python爬虫实践——爬取豆瓣电影排行榜

时间:2024-03-22 13:35:29

一、爬虫的介绍及爬虫环境的安装:

1.爬虫简介:

即网络爬虫,是一种自动获取网页内容的程序。是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上就是针对爬虫而做出的优化。

2.爬虫的基本工作流程及框架:

1.首先选取一部分精心挑选的种子URL;
2.将这些URL放入待抓取URL队列;
3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL放进已抓取URL队列。

4.分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环。

python爬虫实践——爬取豆瓣电影排行榜

3.接下来需要爬取的豆瓣电影排行榜网页界面为:

python爬虫实践——爬取豆瓣电影排行榜

4.人工操作步骤:

1.获取电影信息的网页; 
2.找到要评分信息的位置; 
3.复制、保存我们想要的评分数据。

5.爬虫操作步骤:

1.请求并下载电影页面信息; 
2.解析并定位评分信息; 

3.保存评分数据。

下面我们就使用requests和xpath来爬取豆瓣电影中的“电影名”、“导演”、“演员”、“评分”等信息。

6.爬虫前python环境的安装:

打开cmd,输入以下指令:

pip install requests

pip install lxml

二、正式开始爬虫的步骤:

1.导入模块:

python爬虫实践——爬取豆瓣电影排行榜

2.获取豆瓣电影目标网页并解析:

豆瓣电影排行榜的网址为:

https://movie.douban.com/chart

首先设置headers,伪装成浏览器 #一些网站会设置一些反爬策略来限制爬取数据,所以就需要让爬虫伪装成浏览器取爬取数据

设置url为想爬取的网址

然后用requests.get()方法获取页面的text,

然后用etree.HTML()来解析下载的页面数据”data“


headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'  #伪装成浏览器
}
url = 'https://movie.douban.com/chart' #豆瓣电影排行榜
data = requests.get(url, headers=headers).text# 给定url并用requests.get()方法来获取页面的text

s=etree.HTML(data)#用etree.HTML()来解析下载的页面数据“data”。

获取电影的xpath信息:

这里的xpath信息要手动获取,获取方式如下:

1.如果你是用谷歌浏览器的话,鼠标“右键”–>“检查元素” 
2. Ctrl+Shift+C将鼠标定位到标题。 

3.“右键”–> “Copy”–> “Copy Xpath”就可以复制xpath

如下图:

python爬虫实践——爬取豆瓣电影排行榜

接下来我们获取了电影名称,电影网址,电影评分,电影评价的人数,电影的上映日期及主演等的xpath,发现这些xpath的前半部分都是相同的,所以我们就截取前半部分通用的xpath存放于file中.

例如:获取电影主演的xpath为://*[@id="content"]/div/div[1]/div/div/table[1]/tbody/tr/td[2]/div/p

其中需要把/tbody删除掉,不然获取不了想要的信息,然后只需把table[1]改为:table,就能获取该页面中的多个电影信息。

即截取前半部分的最终xpath为:

.//*[@id="content"]/div/div[1]/div/div/table/tr

利用time.sleep方法睡眠,防止怕太快被网站封了

利用for循环遍历file,然后用.xpath方法连接后半部分的xpath,定位到具体的内容,如果有额外的字符出现还可以用.strip()方法使其去掉,然后把内容存放在变量中。最后在循环内把每次获取到的值输出即可。


file=s.xpath('.//*[@id="content"]/div/div[1]/div/div/table/tr')#copy网页的xpath,截取前半部分通用的
time.sleep(3)#睡眠,防止爬太快被网站封了
scores='评分:'
evaluate='一句话评价:'
actor='上映日期及主演:'
for div in file:
    title = div.xpath("./td[1]/a/@title")[0]
    href = div.xpath("./td[1]/a/@href")[0]
    score=div.xpath("./td[2]/div/div/span[2]/text()")[0]
    num=div.xpath("./td[2]/div/div/span[3]/text()")[0].strip("(").strip().strip(")").strip()
    director = div.xpath("./td[2]/div/p/text()")[0]#截取后半部分的xpath,定位到具体的内容
    print(f"{title},{href},{actor}{director},{scores}{score},{num}\n")#输出爬取到的内容

该爬虫程序的完整代码如下:

from lxml import etree
import requests
import time#这里导入时间模块,以免豆瓣封你IP

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'  #伪装成浏览器
}
url = 'https://movie.douban.com/chart' #豆瓣电影排行榜
data = requests.get(url, headers=headers).text# 给定url并用requests.get()方法来获取页面的text

s=etree.HTML(data)#用etree.HTML()来解析下载的页面数据“data”。
file=s.xpath('.//*[@id="content"]/div/div[1]/div/div/table/tr')#copy网页的xpath,截取前半部分通用的
time.sleep(3)#睡眠,防止爬太快被网站封了
scores='评分:'
evaluate='一句话评价:'
actor='上映日期及主演:'
for div in file:
    title = div.xpath("./td[1]/a/@title")[0]
    href = div.xpath("./td[1]/a/@href")[0]
    score=div.xpath("./td[2]/div/div/span[2]/text()")[0]
    num=div.xpath("./td[2]/div/div/span[3]/text()")[0].strip("(").strip().strip(")").strip()
    director = div.xpath("./td[2]/div/p/text()")[0]#截取后半部分的xpath,定位到具体的内容
    print(f"{title},{href},{actor}{director},{scores}{score},{num}\n")#输出爬取到的内容

爬取豆瓣电影排行榜的结果如下:

python爬虫实践——爬取豆瓣电影排行榜