首先,作为练手,我也是看别人的博客文章学习写爬虫的,过程中遇到很多问题,不过经过自己的努力完成了此项任务,虽然过程波折,但是收获不会少,作为自学可谓加深印象。先说下需求,使用Python3.5版本获取豆瓣950多部电影排行信息,包含电影名称、导演、主演、编剧、类型、时长、上映时间、评分、票房、评分人数等一系列信息。
参考文章:https://blog.csdn.net/Fighting_No1/article/details/50926008?locationNum=8&fps=1
#!/usr/bin/python
#-*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import re
import urllib.request
import xlwt
#得到页面全部内容
def askURL(url):
fakeHeaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; rv:16.0) (Gecko/20100101 Firefox/16.0)'}#伪装请求头
request = urllib.request.Request(url, headers=fakeHeaders)#发送请求
proxy = urllib.request.ProxyHandler({'http': 'http://192.168.1.11:1080'})#设置代理
opener = urllib.request.build_opener(proxy)#打开代理
urllib.request.install_opener(opener)#使用代理
try:
response = urllib.request.urlopen(request)#取得响应
html = response.read()#获取网页内容
return html
except urllib.request.URLError as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
#获取相关内容
def getData(baseurl):
#re.M或re.MULTILINE:使用^或$时会匹配每一行的行首或行尾
#re.S或re.DOTALL:使用.时能匹配换行符
# 找到片名
findTitle=re.compile(r'(.*?)', re.S|re.M)
#找到评分
findRating=re.compile(r' ')
#找到评价人数
findJudge=re.compile(r'(.*)')
#找到影片相关内容:导演,主演,类型,制片国家,年份
findAbstract=re.compile(r'(.*)', re.S)
#找到发行类别、上映时间、总票房
findQuote=re.compile(r'(.*)
', re.S)
datalist = []
for i in range(0,39):
#url每页显示25条数据,所以需要循环遍历
url=baseurl+str(i*25)#+'&sort=seq&sub_type='
html=askURL(url)
soup = BeautifulSoup(html, "html5lib", from_encoding="utf-8")
for item in soup.find_all('div', class_='doulist-item'):#找到每一个影片项
data = []
item = str(item)#转换成字符串
titles = re.findall(findTitle, item)#获取电影名称
newtitles = re.sub('\s', '', titles[1])#去掉\n符和空白
data.append(newtitles) # 添加中文片名
rating = re.findall(findRating, item)#获取评分,评分貌似也有为空的
if (len(rating) == 1):
score = rating[0]
data.append(score)#添加评分
else:
data.append(' ')# 留空
judgeNum=re.findall(findJudge, item)[0]#获取评价数量,评价数量貌似也有为空的
newJudgeNum = re.findall(r'\d+', judgeNum)#取出数字
if len(newJudgeNum) != 0:
peoplenum = newJudgeNum[0]
data.append(peoplenum)#添加评价数量
else:
data.append(' ')# 留空
a = re.findall(findAbstract, item)
#这里可能会有空字符串出现
if len(a) != 0:
abstract=re.findall(findAbstract, item)[0]
abstract = re.sub('\s', "", abstract)#替换/
abstract = re.sub('
输出效果:
注意事项:这里输出发现第50条数据有问题,可通过手动删除得到其余952条电影信息,暂时不知道原因无法修正,如果你们发现了告诉我一声,我也好改正。我在程序中写入了953行,这样多余的冗余数据可通过手动删除来规避。
转载请标明原作者出处,谢谢