python爬取豆瓣top250

Quinta ·
更新时间:2024-09-20
· 678 次阅读

%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%201.分析并获取url链接

豆瓣top250榜单共有10页,每页有25部电影,找到url链接中的规律如下:

即数字相差为25,用for循环生成链接如下:

即得到了我们要爬取的所有链接(以上只截取部分)。

2.请求服务器

2.1%20设置浏览器代理:网页空白处单击鼠标右键,点击检查,选择Network,All,刷新网页后双击第一个文件,选择headers,下拉到最底部复制如下内容:
设置的浏览器代理为字典型:

headers%20=%20{ %20%20%20%20'User-Agent':%20'Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/70.0.3538.102%20Safari/537.36%20Edge/18.18362' }

2.2请求服务器格式及内容:

请求源代码,向服务器发出请求,显示‘200’代表成功。 在后面加上%20.text%20表示输出文本内容。 第二个%20url%20是使用的链接,第二个%20headers%20是用来做浏览器代理的内容。

2.3请求服务器代码:

import%20requests url='https://movie.douban.com/top250?start=%s&filter='%page headers%20=%20{ %20%20%20%20'User-Agent':%20'Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/70.0.3538.102%20Safari/537.36%20Edge/18.18362' } reponse%20=%20requests.get(url%20=%20url,%20headers%20=%20headers).text 3.xpath提取信息

3.1获取xpath节点

3.2%20xpath提取内容

from%20lxml%20import%20etree html_etree%20=%20etree.HTML(reponse)

3.2.1%20提取文本
当我们提取标签内的文本时,需要在复制到的xpath后面加上/text()%20,告诉它需要提取的内容是此标签所呈现的文本或数据,如电影排名+《肖申克的救赎》所要提取xpath的代码为:

1 肖申克的救赎

xpath分别为:

//*[@id="content"]/div/div[1]/ol/li[1]/div/div[1]/em //*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/span[1]

提取文本的代码为:

from%20lxml%20import%20etree html_etree%20=%20etree.HTML(reponse) li%20=%20html_etree.xpath('//*[@id="content"]/div/div[1]/ol/li') for%20item%20in%20li: %20%20%20%20#电影排名 %20%20%20%20rank%20=%20item.xpath('./div/div[1]/em/text()')[0] %20%20%20%20#电影名称 %20%20%20%20name%20=%20item.xpath('./div/div[2]/div[1]/a/span[1]/text()')[0] %20%20%20%20print%20(rank,name)

注:li%20标签前面的作为父级,后面的为子集,用./%20代替父级的位置,所以改写为:

rank%20=%20item.xpath('./div/div[1]/em/text()')[0] name%20=%20item.xpath('./div/div[2]/div[1]/a/span[1]/text()')[0]

结果为:

'1%20肖申克的救赎'

*其中代码最后加的[0]表示字符串形式,不加[0]表示数组形式。分别表示为:

字符串形式:%201%20肖申克的救赎 数组形式:%20['1%20肖申克的救赎']

3.2.2%20提取链接
每一个链接都是在标签内的,通常放在src="%20"%20或者%20href="%20"%20之中,如:

xpath为:

//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a

提取链接:提取链接时,需要在复制到的xpath后面加上/@href%20,%20指定提取链接:

#电影链接 movie_url%20=%20html_etree.xpath('//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/@href')[0] print%20(movie_url)

提取结果:

https://movie.douban.com/subject/1292052/

3.2.3%20提取星级、评分、评价人数
这个网页中电影的星级没有用文本表示,而是用标签表示的,如:

所以只需要提取出%20class="%20"中的内容就可以得到相对应的星级了。复制它的xpath,和提取链接的方法一样,在后面加上%20/@class%20即可;提取评分和评价人数的方法与提取电影名称的方法一样,在后面加上/text()即可,如:

%20%20%20%20#电影星级 %20%20%20%20rating%20=%20item.xpath('./div/div[2]/div[2]/div/span[1]/@class')[0] %20%20%20%20print(rating) %20%20%20%20#电影评分 %20%20%20%20rating_num%20=%20item.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0] %20%20%20%20print(rating_num) %20%20%20%20#电影评价人数 %20%20%20%20content%20=%20item.xpath('./div/div[2]/div[2]/div/span[4]/text()')[0] %20%20%20%20print(content)

提取结果分别为:

rating5-t 9.7 1973359人评价 4.正则表达式匹配信息

如需把结果中的信息匹配出来,可以使用正则表达式把它提取出来。因为它是以%20rating5-t%20等方式呈现的,我们只需要它数字‘5’的部分,所以需要进行二次提取。
4.1、提取固定位置信息
正则表达式中可以使用%20.*?%20来进行匹配信息,在需要提取固定位置信息的地方加上一个括号%20(.*?)%20可以提取出括号内的内容,如:

import%20re test%20=%20"rating5-t" text%20=%20re.findall('rating(.*?)-t',%20test) print%20(text)

运行结果为:

['5']

4.2、匹配出数字
电影评价人数,xpath提取到的数据格式为:1056830人评价%20,保存的时候只需要数字,所以要把数字提取出来:

import%20re%20 data%20=%20"1059232人评价" num%20=%20re.sub(r'\D',%20"",%20data) print("这里的数字是:",%20num)

运行结果:

1059232 5、提取所有信息

综合以上代码,汇总为:

import%20requests import%20re from%20lxml%20import%20etree #设置浏览器代理 headers%20=%20{ %20%20%20%20'User-Agent':%20'Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/70.0.3538.102%20Safari/537.36%20Edge/18.18362' } %20%20%20%20#%20请求源代码,向服务器发出请求,200代表成功 %20%20%20%20reponse%20=%20requests.get(url%20=%20url,%20headers%20=%20headers).text %20%20%20%20html_etree%20=%20etree.HTML(reponse) %20%20%20%20#%20过滤 %20%20%20%20li%20=%20html_etree.xpath('//*[@id="content"]/div/div[1]/ol/li') %20%20%20%20for%20item%20in%20li: %20%20%20%20%20%20%20%20#电影排名 %20%20%20%20%20%20%20%20rank%20=%20item.xpath('./div/div[1]/em/text()')[0] %20%20%20%20%20%20%20%20#电影名称 %20%20%20%20%20%20%20%20name%20=%20item.xpath('./div/div[2]/div[1]/a/span[1]/text()')[0] %20%20%20%20%20%20%20%20#电影链接 %20%20%20%20%20%20%20%20movie_url%20=%20item.xpath('./div/div[2]/div[1]/a/@href')[0] %20%20%20%20%20%20%20%20#电影星级 %20%20%20%20%20%20%20%20rating%20=%20item.xpath('./div/div[2]/div[2]/div/span[1]/@class')[0] %20%20%20%20%20%20%20%20rating%20=%20re.findall('rating(.*?)-t',rating)[0] %20%20%20%20%20%20%20%20if%20len(rating)%20==%202: %20%20%20%20%20%20%20%20%20%20%20%20star%20=%20int(rating)%20/%2010 %20%20%20%20%20%20%20%20else: %20%20%20%20%20%20%20%20%20%20%20%20star%20=%20rating %20%20%20%20%20%20%20%20#电影评分 %20%20%20%20%20%20%20%20rating_num%20=%20item.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0] %20%20%20%20%20%20%20%20#电影评价人数 %20%20%20%20%20%20%20%20content%20=%20item.xpath('./div/div[2]/div[2]/div/span[4]/text()')[0] %20%20%20%20%20%20%20%20content%20=%20re.sub(r'\D',"",content) %20%20%20%20%20%20%20%20print(rank,name,movie_url,star,rating_num,content)

运行结果为(截取第一页为例):

1%20肖申克的救赎%20https://movie.douban.com/subject/1292052/%205%209.7%201974974 2%20霸王别姬%20https://movie.douban.com/subject/1291546/%205%209.6%201460983 3%20阿甘正传%20https://movie.douban.com/subject/1292720/%205%209.5%201497788 4%20这个杀手不太冷%20https://movie.douban.com/subject/1295644/%204.5%209.4%201691633 5%20美丽人生%20https://movie.douban.com/subject/1292063/%205%209.5%20945115 6%20泰坦尼克号%20https://movie.douban.com/subject/1292722/%204.5%209.4%201445256 7%20千与千寻%20https://movie.douban.com/subject/1291561/%204.5%209.4%201545988 8%20辛德勒的名单%20https://movie.douban.com/subject/1295124/%205%209.5%20763919 9%20盗梦空间%20https://movie.douban.com/subject/3541415/%204.5%209.3%201436154 10%20忠犬八公的故事%20https://movie.douban.com/subject/3011091/%204.5%209.4%20993496 11%20海上钢琴师%20https://movie.douban.com/subject/1292001/%204.5%209.3%201195972 12%20楚门的世界%20https://movie.douban.com/subject/1292064/%204.5%209.3%201059839 13%20三傻大闹宝莱坞%20https://movie.douban.com/subject/3793023/%204.5%209.2%201326770 14%20机器人总动员%20https://movie.douban.com/subject/2131459/%204.5%209.3%20947087 15%20放牛班的春天%20https://movie.douban.com/subject/1291549/%204.5%209.3%20923406 16%20星际穿越%20https://movie.douban.com/subject/1889243/%204.5%209.3%201066796 17%20大话西游之大圣娶亲%20https://movie.douban.com/subject/1292213/%204.5%209.2%201045100 18%20熔炉%20https://movie.douban.com/subject/5912992/%204.5%209.3%20642609 19%20疯狂动物城%20https://movie.douban.com/subject/25662329/%204.5%209.2%201243956 20%20无间道%20https://movie.douban.com/subject/1307914/%204.5%209.2%20851093 21%20龙猫%20https://movie.douban.com/subject/1291560/%204.5%209.2%20888995 22%20教父%20https://movie.douban.com/subject/1291841/%204.5%209.3%20649741 23%20当幸福来敲门%20https://movie.douban.com/subject/1849031/%204.5%209.1%201061614 24%20怦然心动%20https://movie.douban.com/subject/3319755/%204.5%209.1%201230844 25%20触不可及%20https://movie.douban.com/subject/6786002/%204.5%209.2%20693600 6、内容写入CSV文件

写入并保存内容分为三步:

打开文件夹 写入文件夹 关闭文件夹 import%20csv #%20创建文件并打开 fp%20=%20open("./豆瓣top250.csv",%20'a',%20newline='',%20encoding%20=%20'utf-8-sig') writer%20=%20csv.writer(fp) #%20把内容写入文件 writer.writerow(('排名',%20'名称',%20'链接',%20'星级',%20'评分',%20'评价人数')) #关闭文件 fp.close() 7.代码汇总 import%20requests,re,csv from%20lxml%20import%20etree #设置浏览器代理 headers%20=%20{ %20%20%20%20'User-Agent':%20'Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/70.0.3538.102%20Safari/537.36%20Edge/18.18362' } #创建文件夹并打开 fp%20=%20open("./豆瓣top250.csv",%20'a',%20newline='',%20encoding%20=%20'utf-8-sig') writer%20=%20csv.writer(fp) #%20写入内容 writer.writerow(('电影排名',%20'电影名称',%20'电影链接',%20'电影星级',%20'电影评分',%20'电影评价人数')) for%20page%20in%20range(0,%20226,%2025): %20%20%20%20print%20("正在获取第%s页"%page) %20%20%20%20url='https://movie.douban.com/top250?start=%s&filter='%page %20%20%20%20#%20请求源代码,向服务器发出请求,200代表成功 %20%20%20%20reponse%20=%20requests.get(url%20=%20url,%20headers%20=%20headers).text %20%20%20%20html_etree%20=%20etree.HTML(reponse) %20%20%20%20#%20过滤 %20%20%20%20li%20=%20html_etree.xpath('//*[@id="content"]/div/div[1]/ol/li') %20%20%20%20for%20item%20in%20li: %20%20%20%20%20%20%20%20#电影排名 %20%20%20%20%20%20%20%20rank%20=%20item.xpath('./div/div[1]/em/text()')[0] %20%20%20%20%20%20%20%20#电影名称 %20%20%20%20%20%20%20%20name%20=%20item.xpath('./div/div[2]/div[1]/a/span[1]/text()')[0] %20%20%20%20%20%20%20%20#电影链接 %20%20%20%20%20%20%20%20movie_url%20=%20item.xpath('./div/div[2]/div[1]/a/@href')[0] %20%20%20%20%20%20%20%20#电影星级 %20%20%20%20%20%20%20%20rating%20=%20item.xpath('./div/div[2]/div[2]/div/span[1]/@class')[0] %20%20%20%20%20%20%20%20rating%20=%20re.findall('rating(.*?)-t',rating)[0] %20%20%20%20%20%20%20%20if%20len(rating)%20==%202: %20%20%20%20%20%20%20%20%20%20%20%20star%20=%20int(rating)%20/%2010 %20%20%20%20%20%20%20%20else: %20%20%20%20%20%20%20%20%20%20%20%20star%20=%20rating %20%20%20%20%20%20%20%20#电影评分 %20%20%20%20%20%20%20%20rating_num%20=%20item.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0] %20%20%20%20%20%20%20%20#电影评价人数 %20%20%20%20%20%20%20%20content%20=%20item.xpath('./div/div[2]/div[2]/div/span[4]/text()')[0] %20%20%20%20%20%20%20%20content%20=%20re.sub(r'\D',"",content) %20%20%20%20%20%20%20%20#print(rank,name,movie_url,star,rating_num,content) %20%20%20%20%20%20%20%20#%20写入内容 %20%20%20%20%20%20%20%20writer.writerow((rank,name,movie_url,star,rating_num,content)) #关闭文件夹 fp.close() jupyter运行截屏

csv文件截屏

作者:帮我打开可乐



top250 top Python

需要 登录 后方可回复, 如果你还没有账号请 注册新账号