爬取豆瓣电影top250
引言
为实现豆瓣top50电影在一个Excel表中一览无遗~
【存在问题】
一次性写入csv存在问题:
UnicodeEncodeError: 'gbk' codec can't encode character '\xee' in position 59: illegal multibyte sequence
如果你想一下子爬下来,本代码无法实现。
思路
html比较清晰的字段,可以一下子爬取250条;稍微混乱点的,或者存在空字段的采取了分页爬取措施。
影片、上映年份、评分、评价人数一下子爬取250条;其余分页爬取,分别是导演主演、地区类型、一句话总概括。
下面的代码最重要的部分是
obj=re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<电影名>.*?)</span>',re.S)
如何找出你要的内容,参考python爬虫入门(6)爬取豆瓣电影top250
1.影片
# 需要的库
import requests
import re
# 250
for i in range(0,250,25):
url = "https://movie.douban.com/top250?start="+str(i)+"&filter="
headers = {
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"
}
resp=requests.get(url,headers=headers)
page_content=resp.text # html
#测试一下,爬取电影名
obj=re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<电影名>.*?)</span>',re.S)
ret = obj.finditer(page_content)#页面源码代入解析
for it in ret:
print(it.group("电影名"))
2.上映年份
# 250
for i in range(0,250,25):
url = "https://movie.douban.com/top250?start="+str(i)+"&filter="
headers = {
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"
}
resp=requests.get(url,headers=headers)
page_content=resp.text # html
#测试一下,爬取年份
obj=re.compile(r'<li>.*?<div class="item">.*?<p class="">.*?<br>(?P<年份>.*?) ',re.S)
ret = obj.finditer(page_content)#页面源码代入解析
for it in ret:
print(it.group("年份").strip())
3.评分
# 250
for i in range(0,250,25):
url = "https://movie.douban.com/top250?start="+str(i)+"&filter="
headers = {
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"
}
resp=requests.get(url,headers=headers)
page_content=resp.text # html
#评分
obj=re.compile(r'<li>.*?<div class="item">.*?<span class="rating_num" property="v:average">(?P<评分>.*?)</span>',re.S)
ret = obj.finditer(page_content)#页面源码代入解析
for it in ret:
print(it.group("评分").strip())
4.评价人数
# 250
for i in range(0,250,25):
url = "https://movie.douban.com/top250?start="+str(i)+"&filter="
headers = {
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"
}
resp=requests.get(url,headers=headers)
page_content=resp.text # html
#评价人数
obj=re.compile(r'<li>.*?<div class="item">.*?<span>(?P<评价人数>.*?)人评价</span>',re.S)
ret = obj.finditer(page_content)#页面源码代入解析
for it in ret:
print(it.group("评价人数").strip())
5.导演主演
i=225 #你要爬取的是哪一页
url = "https://movie.douban.com/top250?start="+str(i)+"&filter="
headers = {
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"
}
resp=requests.get(url,headers=headers)
page_content=resp.text # html
#爬取一页的,导演主演
obj=re.compile(r'<li>.*?<div class="item">.*?<p class="">.*?(?P<导演主演>.*?)<br>',re.S)
ret = obj.finditer(page_content)#页面源码代入解析
for it in ret:
print(it.group("导演主演").strip())
6.地区类型
i=225
url = "https://movie.douban.com/top250?start="+str(i)+"&filter="
headers = {
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"
}
resp=requests.get(url,headers=headers)
page_content=resp.text # html
#爬取一页的,地区类型
obj=re.compile(r'<li>.*?<div class="item">.*?<p class="">.*? / (?P<地区类型>.*?)</p>',re.S)
ret = obj.finditer(page_content)#页面源码代入解析
for it in ret:
print(it.group("地区类型").strip())
7.一句话总概括
i=200
url = "https://movie.douban.com/top250?start="+str(i)+"&filter="
headers = {
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"
}
resp=requests.get(url,headers=headers)
page_content=resp.text # html
#爬取一页的,经典台词
obj=re.compile(r'<li>.*?<div class="item">.*?<span class="inq">(?P<经典台词>.*?)</span>',re.S)
ret = obj.finditer(page_content)#页面源码代入解析
for it in ret:
print(it.group("经典台词"))
可以看出导演主演,地区类型是一起爬出的,由于数据比较少,就在Excel中直接进行单元格切分处理了。