代码详解
1#爬虫库
2import requests
3#json数据格式库
4import json
5#requests异常
6from requests.exceptions import RequestException
7#正则表达式
8import re
9#延迟函数
10import time
11
12#定义一个读取一个url并返回相应信息的函数
13def get_one_page(url):
14 try:
15 #伪装浏览器
16 headers={
17 "User-Agent":'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
18 }
19 #读取网页
20 response=requests.get(url,headers=headers)
21 #判断是否读取成功
22 if response.status_code==200:
23 #返回读取的内容(html代码)
24 return response.text
25 return None
26 except RequestException:
27 return None
28#定义一个解析html代码的函数
29def parse_one_page(html):
30 #编译成一个正则表达式对象
31 pattern = re.compile(r'<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
32 + '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
33 + '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)
34 #开始查找
35 items = re.findall(pattern, html)
36 #遍历查找到的内容
37 for item in items:
38 #使用关键字yield 类似于return 返回的是一个生成器对象
39 yield {
40 'index': item[0],
41 'image': item[1],
42 'title': item[2],
43 'actor': item[3].strip()[3:],
44 'time': item[4].strip()[5:],
45 'score': item[5] + item[6]
46 }
47#将结果写到一个txt文档中
48def write_to_file(content):
49 with open('result.txt', 'a', encoding='utf-8') as f:
50 f.write(json.dumps(content, ensure_ascii=False) + '\n')
51#图片下载
52def pic_download(url,title):
53 r=requests.get(url)
54 with open("pics/"+title+".jpg",'wb') as f:
55 f.write(r.content)
56#打开需要爬取得所有网页,并进行爬取
57def main(offset):
58 #网页链接
59 url='http://maoyan.com/board/4?offset='+str(offset)
60 #请求网页,获取html
61 html=get_one_page(url)
62 #遍历处理后的html结果
63 for item in parse_one_page(html):
64 #下载图片
65 pic_download(item['image'], item['title'])
66 #写入到文件中
67 write_to_file(item)
68if __name__ == '__main__':
69 for i in range(10):
70 main(offset=i*10)
71 #延迟1秒,避免反爬机制
72 time.sleep(1)
效果图: