爬取豆瓣图书TOP250的内容,并写入cvs文件
- 简化一下,20行代码可以完成,为了美观和便于理解,加了几行,控制在了30行。
- 体会:
1、requests库和beautifulsoup库方便
2、select比较实用
3、豆瓣对爬虫比较友好,基本没有反爬限制,适当加上sleep即可
4、写入文件cvs比较好用 - 几个不足
1、学习的时候是正则,实用的时候嫌麻烦改了select
2、下步需要加headers,cookies。
3、爬取结果放入数据库
4、不规则页面的处理,确保不中断。
5、多线程和异步。
import requests
from bs4 import BeautifulSoup
import time
urls=['https://book.douban.com/top250?start={}'.format(str(i)) for i in range(0,250,25)] #构建所有页面的列表
def get_oneurl(url):
r=requests.get(url)
soup=BeautifulSoup(r.text,'lxml')
titles=soup.select("#content div.pl2 > a")
artics=soup.select("#content p.pl")
scores=soup.select('#content span.rating_nums')
one_words=soup.select('#content span.inq')
for title,artic,score,one_word in zip(titles,artics,scores,one_words):
a_1=title.text.strip().replace(' ','').replace('\n','')
a_2=title.get("href")
a_3=artic.get_text().split('/')[0]
a_4=artic.get_text().split('/')[-3]
a_5=artic.get_text().split('/')[-2]
a_6=artic.get_text().split('/')[-1]
a_7=score.get_text()
a_8=one_word.get_text(),
with open('douban.csv','a',encoding='utf-8')as f:
f.write('{},{},{},{},{},{},{},{},\n '.format(a_1,a_2,a_3,a_4,a_5,a_6,a_7,a_8))
#主程序运行,清楚原有文件内容并打印标题
with open('douban.csv','w',encoding='utf-8')as f:
f.write("书名,链接,作者,出版社,日期,价格,评分,一句话点评 \n")
for url in urls:
get_oneurl(url)
print (url +' ok')
time.sleep(1)
cvs文件用记事本另存为ansi编码后可直接用excel打开。