- 阅读权限
- 255
- 威望
- 0 级
- 论坛币
- 185 个
- 通用积分
- 30.2855
- 学术水平
- 0 点
- 热心指数
- 0 点
- 信用等级
- 0 点
- 经验
- 3112 点
- 帖子
- 26
- 精华
- 0
- 在线时间
- 238 小时
- 注册时间
- 2014-6-8
- 最后登录
- 2025-6-29
硕士生
还不是VIP/贵宾
- 威望
- 0 级
- 论坛币
 - 185 个
- 通用积分
- 30.2855
- 学术水平
- 0 点
- 热心指数
- 0 点
- 信用等级
- 0 点
- 经验
- 3112 点
- 帖子
- 26
- 精华
- 0
- 在线时间
- 238 小时
- 注册时间
- 2014-6-8
- 最后登录
- 2025-6-29
 | 开心 2022-2-13 23:41:57 |
|---|
签到天数: 91 天 连续签到: 1 天 [LV.6]常住居民II
|
经管之家送您一份
应届毕业生专属福利!
求职就业群
感谢您参与论坛问题回答
经管之家送您两个论坛币!
+2 论坛币
断断续续用了两三个月时间学习python.终于开始上手写项目了。。第一个项目是爬取豆瓣读书所有图书标签下的图书信息,将它放进CSV文件里。之前没有加headers伪装浏览器,速度非常快,几分钟就把一个标签下100多页的信息全部爬取下来了。后来因为速度太快,被网站发现,差点被封IP。然后,我在requests命令下加了header,以及cookie。程序跑起来完全没有问题。。最大的问题就是速度实在太慢了,爬取一页需要4-5分钟。照这样计算,一个标签有近100页,那就要8个小时才能爬完,而豆瓣读书的标签起码有100个。。那岂不是要爬取一个月?对了,我没有用上多线程。我想请问下,为什么python爬虫这么慢?用了多线程会有多快。python爬虫速度是否会和内存有关,我电脑内存只有4G,扩展后会不会更快。
- #定义函数获取分类图书信息
- def get_book_info(tag):
- tag_url=url+tag
- book_lists=[]
- for page in range(0, 20 * get_max_page(tag), 20):
- book_url= tag_url +'?start=' + str(page)
- print('正在爬取第'+str(page)+'页')
- start_time=time.time()
- headers={'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
- 'Host':'book.douban.com',
- 'Referer':'https://www.douban.com/accounts/login?source=book',
- 'user_Agent':user_agents[random.randint(0,3)],
- 'cookie':cookies}
- #proxies=get_proxies_from_site()[random.randint(0,len(get_proxies_from_site()))]
- res=requests.get(tag_url,headers=headers)
- soup=BeautifulSoup(res.text,"lxml")
- #pubs=soup.select('.pub')
- for p in soup.select('.info'):
- main_title=p.select('[title]')[0]['title'] #获得主书名
- if len(p.select('span')[0].get_text())>0:
- side_title = p.select('h2 span')[0].get_text() #获得副书名
- title=main_title+side_title #合并得书名
- else:
- title=main_title
- author=p.select('.pub')[0].get_text().split("/")[0].strip() #获得作者
- pub_time=p.select('.pub')[0].get_text().split("/")[-2].strip() #出版日期
- price = p.select('.pub')[0].get_text().split("/")[-1].strip().strip('元')#金额
- publish=p.select('.pub')[0].get_text().split("/")[-3].strip() #出版社
- star=p.select('.rating_nums')[0].get_text()
- book_lists.append((title,author,pub_time,price,publish,star))
-
- time.sleep(random.randint(10,20))
- end_time=time.time()
- print('爬取一页用时:'+str(end_time-start_time)+'秒')
- return book_lists
- #用大标签名字生成文件夹目录
- total_start=time.time()
- for key,values in get_tags_dict().items():
- os.makedirs('.\%s' %(key),exist_ok=True)
- print('正在生成%s文件夹' %(key))
- for value in values:
- print('正在写入%s的CSV文件' % (value))
- start=time.time()
- csvfile=open('.\%s\%s.csv' %(key,value),'w',newline='')
- writer=csv.writer(csvfile)
- writer.writerow(['书名', '作者', '出版日期/版数', '价格', '出版社', '评分'])
- writer.writerows(get_book_info(value))
- csvfile.close()
- end=time.time()
- print('总共耗时:'+str(end-start)+'秒')
- #time.sleep(random.randint(10,20))
- print('>>>>>>>>>>>>>>>>>>>>>>>>>')
- total_end=time.time()
- print('总共耗时'+str(total_end-total_start)+'秒')
复制代码
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
|
|
|