爬虫的目标
爬取猫眼电影TOP100的电影名称,时间,评分,图片等信息
猫眼TOP100网站:http://maoyan.com/board/4
抓取分析
查看网页源代码,找到对应的目标信息,发现一部电影对应的源代码是一个dd节点
抓取首页
为了方便,这里先抓取第一页的内容,运行之后,可以查看到网页的源代码,之后需要对页面进行解析。
import requests
def get_one_page(url):
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
} #头信息,爬取一些网站时需要加上,否则可能会爬取失败
response = requests.get(url,headers=headers)
if (response.status_code==200):
return response.text #返回网页内容
return None
def main():
url = 'http://www.maoyan.com/board/4'
html = get_one_page(url)
print(html)
main()
正则匹配
正则表达式匹配对应的电影排名,图片,名称,内容,主演,发布时间,评分等7个内容
首先先看看正则匹配电影排名:<dd>.?board-index.?>(.*?)</i>
(.*?)是方便可以用group()得到所要的结果
下面贴出爬取以上7种的正则表达式(较复杂,在后续的文章中会改进,这里只做简单使用)
<dd>.?board-index.?>(.?)</i>.?data-src="(.?)".?name.?a.?>(.?)</a>.?star.?>(.?)</p>.?releasetime.?>(.?)</p>.?integer.?>(.?)</i>.?fraction.?>(.?)</i>.?</dd>
通过调用findall()方法提取所有内容,接下来,我们定义一个解析页面的方法parse_one_page(),代码如下
def parse_one_page(html):
pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S)
items = re.findall(pattern,html)
print(items)
成功将一页的信息打印出来,以列表的形式,下面是输出结果:
将提取的匹配结果从列表转换成字典格式
def parse_one_page(html):
pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S)
items = re.findall(pattern,html)
for item in items:
yield{
'index':item[0],
'image':item[1],
'title':item[2].strip(),
'actor':item[3].strip()[3:] if len(item[3])>3 else '',
'time':item[4].strip()[5:] if len(item[4])>5 else '',
'score':item[5].strip() + item[6].strip()
}
写入文件
dumps是将dict转化成str格式
content是一个字典类型的数据,一部电影的提取结果
ensure_ascii=False保证写入文件的是中文而不是Unicode编码
def write_to_file(content):
with open('result.txt','a',encoding='utf-8') as f:
print(type(json.dumps(content)))
f.write(json.dumps(content,ensure_ascii=False)+'\n')
分页爬取
if __name__=='__main__':
for i in range(10):
main(offset=i*10)
time.sleep(1)
本章总结
通过本次练习,加强掌握requests和re库的用法,这只是一个简单的爬虫实例,后续会继续更新更多的爬虫文章
ps:参考教程:Python3爬虫开发实战
源代码会在后续中上传至github
网友评论