这里爬取猫眼电影 TOP100 榜的信息,作为学习的第一个Demo。
今天开始接触的python,从爬虫开始。 语言相对来说比较简单,环境配置到是花了不少时间。
-
作为新人,建议先选择一个好的开发工具,vim相对来说不是太好用 10个最好用的python集成开发环境
有个要注意的点是在引入beautifurSoup库的时候会报错,因为3.x的库需要引入的是beautifurSoup4.
到这一步环境配置基本上OK了,可以开始进入正题了
Python3网络爬虫实战 ,
知识点比较广,从一个爬虫事例开始.
目标
提取出猫眼电影 TOP100 榜的电影名称、时间、评分、图片等信息,提取的站点 URL 为:http://maoyan.com/board/4,提取的结果以文件形式保存下来。
准备工作
添加Requests依赖库,注意不是Request
抓取分析
本节我们需要抓取的目标站点为:http://maoyan.com/board/4,打开之后便可以查看到榜单的信息,如图
抓取首页
接下来我们用代码实现这个过程,首先抓取第一页的内容,我们实现一个 get_one_page() 方法,传入 url 参数,然后将抓取的页面结果返回,然后再实现一个 main() 方法调用一下,初步代码实现如下:
import requests def get_one_page(url): response = requests.get(url) if response.status_code == 200: return response.text return None def main(): url = 'http://maoyan.com/board/4' html = get_one_page(url) print(html) main()
正则提取
写入文件
随后将提取的结果写入文件,在这里直接写入到一个文本文件中,通过 json 库的 dumps() 方法实现字典的序列化,并指定 ensure_ascii 参数为 False,这样可以保证输出的结果是中文形式而不是 Unicode 编码,代码实现如下:
def write_to_json(content): with open('result.txt', 'a') as f: print(type(json.dumps(content))) f.write(json.dumps(content, ensure_ascii=False,).encode('utf-8'))
整合代码
def main():
url = 'http://maoyan.com/board/4'
html = get_one_page(url)
for item in parse_one_page(html):
write_to_json(item)
分页爬取
遍历一下给这个链接传入一个 offset 参数,实现其他 90 部电影的爬取,添加如下调用即可:
if __name__ == '__main__':
for i in range(10):
main(offset=i * 10)
将 main() 方法修改一下,接收一个 offset 值作为偏移量,然后构造 URL 进行爬取,实现如下
def main(offset):
url = 'http://maoyan.com/board/4?offset=' + str(offset)
html = get_one_page(url)
for item in parse_one_page(html):
print(item)
write_to_file(item)
完整代码
import json import requests from requests.exceptions import RequestException import re import time def get_one_page(url): try: response = requests.get(url) if response.status_code == 200: return response.text return None except RequestException: return None def parse_one_page(html): pattern = re.compile('<dd>.*?board-index.*?>(\d+)</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], 'actor': item[3].strip()[3:], 'time': item[4].strip()[5:], 'score': item[5] + item[6] } def write_to_file(content): with open('result.txt', 'a', encoding='utf-8') as f: f.write(json.dumps(content, ensure_ascii=False) + '\n') def main(offset): url = 'http://maoyan.com/board/4?offset=' + str(offset) html = get_one_page(url) for item in parse_one_page(html): print(item) write_to_file(item) if __name__ == '__main__': for i in range(10): main(offset=i * 10) time.sleep(1)
作者:PetitBread
链接:http://www.jianshu.com/p/6e6205bef56a
來源:简书