使用python抓取豆瓣电影的排行
# coding = utf-8
import requests
from requests.exceptions import RequestException
import re
import json
from multiprocessing import Pool
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('<li>.*?<em.*?>(\d+)</em>.*?src="(.*?)".*?title">(.*?)</span>.*?v:average">(.*?)</span>.*?inq">(.*?)</span>.*?</li>', re.S)
items = re.findall(pattern,html)
for item in items:
yield {
'index': item[0],
'image': item[1],
'title': item[2],
'score': item[3],
'inq': item[4]
}
def write_to_file(content):
with open('movie.txt', 'a', encoding='utf-8') as f:
jsondumps=json.dumps(content,ensure_ascii=False)
f.write(jsondumps+'\n')
f.close()
def main(start):
url = 'https://movie.douban.com/top250?start='+str(start)+'&filter='
html = get_one_page(url)
for item in parse_one_page(html):
print(item)
write_to_file(item)
if __name__ == '__main__':
pool = Pool()
pool.map(main, [i * 25 for i in range(10)])
这里使用正则表达式提取想要提取的信息。
注意:将抓取的信息写入文件movie.txt时,即使添加了encoding=‘utf-8’ ,txt文件中的中文可能还是unicode编码,我在抓取网页信息的时候就遇到了这个问题,然后在代码中加了一句代码如下:
ensure_ascii=False
问题就解决了。