楼主: bakers2013
1496 1

[问答] 一个小小的python程序用时为什么这么长 [推广有奖]

  • 3关注
  • 0粉丝

硕士生

6%

还不是VIP/贵宾

-

威望
0
论坛币
185 个
通用积分
30.2855
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
3112 点
帖子
26
精华
0
在线时间
238 小时
注册时间
2014-6-8
最后登录
2025-6-29

楼主
bakers2013 学生认证  发表于 2017-8-24 21:20:26 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
断断续续用了两三个月时间学习python.终于开始上手写项目了。。第一个项目是爬取豆瓣读书所有图书标签下的图书信息,将它放进CSV文件里。之前没有加headers伪装浏览器,速度非常快,几分钟就把一个标签下100多页的信息全部爬取下来了。后来因为速度太快,被网站发现,差点被封IP。然后,我在requests命令下加了header,以及cookie。程序跑起来完全没有问题。。最大的问题就是速度实在太慢了,爬取一页需要4-5分钟。照这样计算,一个标签有近100页,那就要8个小时才能爬完,而豆瓣读书的标签起码有100个。。那岂不是要爬取一个月?对了,我没有用上多线程。我想请问下,为什么python爬虫这么慢?用了多线程会有多快。python爬虫速度是否会和内存有关,我电脑内存只有4G,扩展后会不会更快。

  1. #定义函数获取分类图书信息
  2. def get_book_info(tag):
  3.     tag_url=url+tag
  4.     book_lists=[]
  5.     for page in range(0, 20 * get_max_page(tag), 20):
  6.         book_url= tag_url +'?start=' + str(page)
  7.         print('正在爬取第'+str(page)+'页')
  8.         start_time=time.time()
  9.         headers={'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
  10.                  'Host':'book.douban.com',
  11.                 'Referer':'https://www.douban.com/accounts/login?source=book',
  12.                  'user_Agent':user_agents[random.randint(0,3)],
  13.                 'cookie':cookies}
  14.         #proxies=get_proxies_from_site()[random.randint(0,len(get_proxies_from_site()))]
  15.         res=requests.get(tag_url,headers=headers)
  16.         soup=BeautifulSoup(res.text,"lxml")
  17.         #pubs=soup.select('.pub')
  18.         for p in soup.select('.info'):
  19.             main_title=p.select('[title]')[0]['title'] #获得主书名
  20.             if len(p.select('span')[0].get_text())>0:
  21.                 side_title = p.select('h2 span')[0].get_text() #获得副书名
  22.                 title=main_title+side_title #合并得书名
  23.             else:
  24.                 title=main_title
  25.             author=p.select('.pub')[0].get_text().split("/")[0].strip() #获得作者
  26.             pub_time=p.select('.pub')[0].get_text().split("/")[-2].strip() #出版日期
  27.             price = p.select('.pub')[0].get_text().split("/")[-1].strip().strip('元')#金额
  28.             publish=p.select('.pub')[0].get_text().split("/")[-3].strip() #出版社
  29.             star=p.select('.rating_nums')[0].get_text()
  30.             book_lists.append((title,author,pub_time,price,publish,star))
  31.         
  32.             time.sleep(random.randint(10,20))
  33.         end_time=time.time()
  34.         print('爬取一页用时:'+str(end_time-start_time)+'秒')
  35.     return book_lists

  36. #用大标签名字生成文件夹目录
  37. total_start=time.time()
  38. for key,values in get_tags_dict().items():
  39.         os.makedirs('.\%s' %(key),exist_ok=True)
  40.         print('正在生成%s文件夹' %(key))
  41.         for value in values:
  42.             print('正在写入%s的CSV文件' % (value))
  43.             start=time.time()
  44.             csvfile=open('.\%s\%s.csv' %(key,value),'w',newline='')
  45.             writer=csv.writer(csvfile)
  46.             writer.writerow(['书名', '作者', '出版日期/版数', '价格', '出版社', '评分'])
  47.             writer.writerows(get_book_info(value))
  48.             csvfile.close()
  49.             end=time.time()
  50.             print('总共耗时:'+str(end-start)+'秒')
  51.             #time.sleep(random.randint(10,20))
  52.         print('>>>>>>>>>>>>>>>>>>>>>>>>>')
  53. total_end=time.time()
  54. print('总共耗时'+str(total_end-total_start)+'秒')
复制代码


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:python 爬虫

微信图片_20170824211018.png (14.48 KB)

微信图片_20170824211018.png

沙发
胖子的手机 在职认证  发表于 2017-8-28 10:07:36
别来这里问,这个python基本是费了,论坛老板都搞cda去了。
你可以去
https://www.v2ex.com/go/python
https://www.newsmth.net/nForum/#!board/Python?p=1

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-3-11 06:02