线程池增加爬虫效率
一、缘由
有的时候为了提高爬虫的效率,那么就需要使用各种方法来提高爬虫的效率,无疑多线程是一个非常好的选择。不过在使用的时候,一定要控制好爬取的速率,短时间的访问量不要太大。第一,避免给别人家的服务器造成比较大的影响。第二,方式你的IP或者你的账号被封禁。即使出现第二种情况的时候,我们可以使用由代理构建的IP池,和使用cooike池,那么也不能让我们的访问量达到对方服务器访问量的三分之一(一天内)。这次使用的网址是北京新发地菜价的官网。里面更新每天的菜价。这个网站平时的访问量不大,所以千万要小心,不要太疯狂,把人家的服务器弄崩。
二、代码实现
#线程池:一次性开辟一些线程,我们用户直接给线程池提交任务 #线程任务的调度交给线程池完成 from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor from bs4 import BeautifulSoup import requests import csv from concurrent.futures import ThreadPoolExecutor def main(url): ask=askURL(url) f = open('菜价.csv', 'a+', newline='', encoding='utf-8') csvwriter = csv.writer(f) getDAta(ask,csvwriter) print(url+ '提取完成') f.close() #1、请求网页,得到源代码 def askURL(url): res=requests.get(url) return res.text #2、解析源代码 def getDAta(ask,csvwriter): html=BeautifulSoup(ask,'html.parser') table=html.find('table',class_='hq_table') row=table.find_all('tr')[1::] for i in row: td=i.find_all("td") name1=td[0].string name2=td[1].string name3=td[2].string name4=td[3].string name5=td[4].string name6=td[5].string name7=td[6].string csvwriter.writerow([name1,name2,name3,name4,name5,name6,name7]) if __name__=='__main__': with ThreadPoolExecutor(50) as t: for i in range(1,100): url = f'http://www.xinfadi.com.cn/marketanalysis/0/list/{i}.shtml' t.submit(main,url) print('over')