用Requests和正則表示式爬取豆瓣圖書TOP250
阿新 • • 發佈:2018-11-01
思路和上文大同小異。
import requests
from requests.exceptions import RequestException
import re
import json
headers = {'User-Agent':'Mozilla/5.0(Macintosh;Intel Mac OS X 10_11_4)AppleWebKit/537.36(KHTML,like Gecko)Chrome/52.0.2743.116 Safari/537.36'}
#提取單頁內容,用try,except方便找bug
def get_one_page(url):
try :
response = requests.get(url, headers=headers)#傳入headers引數
if response.status_code == 200:
return response.text
return response.status_code
except RequestException:#捕獲這個型別的異常
return None
def parse_one_page(html):#定義一個函式用來解析html程式碼
#生成一個正則表示式物件
pattern = re.compile('<table.*?href.*?title="(\S+)".*?</a>.*?class.*?>(.*?)</p>.*?rating_nums">(.*?)</span>.*?</table>',re.S)
items = re.findall(pattern, html)
#items是一個list,其中的每個內容都是一個元組
#將雜亂的資訊提取並格式化,變成一個字典形式
for item in items:
yield { #構造一個字典
'title' : item[0],
'imf': item[1],
'評分': item[2],
}
def write_to_file(content):
#json.dumps將dict轉json字串型別;顯示中文所以open中加上encoding;注意換行
with open('doubantop250.txt', 'a', encoding='utf-8') as f:
f.write(json.dumps(content, ensure_ascii=False) + '\n')
f.close
def main(offset):
#url= 'http://maoyan.com/board/6?'
url = 'https://book.douban.com/top250?start='+str(offset)
html = get_one_page(url)
global i
for item in parse_one_page(html):#item是一個生成器
print('No.',i,item)
write_to_file(item)
i=i+1
if __name__ == '__main__':
i=1
for j in range(10):
main(j*25)
結果: