线程池增加爬虫效率

一、缘由

  有的时候为了提高爬虫的效率,那么就需要使用各种方法来提高爬虫的效率,无疑多线程是一个非常好的选择。不过在使用的时候,一定要控制好爬取的速率,短时间的访问量不要太大。第一,避免给别人家的服务器造成比较大的影响。第二,方式你的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')

 

posted @ 2021-08-06 00:15  山水无期  阅读(107)  评论(0)    收藏  举报