python多线程访问网页(python多线程请求接口)
python 多线程爬取网站数据利用线程池
"""
@author: wangxingchun
多线程(线程池)
下载数据
"""
import requests
import csv
from concurrent.futures import ThreadPoolExecutor as tp
#创建一个csv文件,注意创建writer对象"csv.writer()"
f = open('xinfadi.csv','w',encoding='utf8')
csvwrite = csv.writer(f)
#如果写入txt文件,不需要创建writer对象。
# f = open('xinfadidata.txt','w',encoding='utf8')
#创建一个函数,以页码做为参数
def down(n_page):
url = ''
data = {'count': 428225,'current': n_page,'limit': 20}
resp = requests.post(url,data=data)
datas =resp.json()
#通过分析数据嵌套情况,获取数据。此处可在网页开发工具json数据中查看分析。
for i in range(len(datas['list'])):
name = datas['list'][i]['prodName']
highPrice = datas['list'][i]['highPrice']
lowPrice = datas['list'][i]['lowPrice']
pubDate = datas['list'][i]['pubDate']
place = datas['list'][i]['place']
csvwrite.writerow((name,highPrice,lowPrice,pubDate,place))#writerow要求写入的是可迭代对象
# f.writelines(f'{name},{highPrice},{lowPrice},{pubDate},{place} ')
resp.close()
if __name__ == '__main__':
with tp(50) as t: #创建线程池,
for n in range(1,101): #遍历数据网页
t.submit(down,n) #提交给线程池,进行多线程下载
print(f'共{n}页数据下载完毕!')
f.close()
Python使用多线程爬取网页时,如果服务器设置了线程限制怎么办呢?
有道的API有限制,同一IP访问频率不可过高,你可以更换IP访问试试,也可以每个线程中sleep几秒
Python爬虫如何避免爬取网站访问过于频繁
一. 关于爬虫
爬虫,是一种按照一定的规则自动地抓取互联网信息的程序。本质是利用程序获取对我们有利的数据。
反爬虫,从不是将爬虫完全杜绝;而是想办法将爬虫的访问量限制在一个可接纳的范围,不要让它过于频繁。
二. 提高爬虫效率的方法
协程。采用协程,让多个爬虫一起工作,可以大幅度提高效率。
多进程。使用CPU的多个核,使用几个核就能提高几倍。
多线程。将任务分成多个,并发(交替)的执行。
分布式爬虫。让多个设备去跑同一个项目,效率也能大幅提升。
打包技术。可以将python文件打包成可执行的exe文件,让其在后台执行即可。
其他。比如,使用网速好的网络等等。
三. 反爬虫的措施
限制请求头,即request header。解决方法:我们可以填写user-agent声明自己的身份,有时还要去填写origin和referer声明请求的来源。
限制登录,即不登录就不能访问。解决方法:我们可以使用cookies和session的知识去模拟登录。
复杂的交互,比如设置“验证码”来阻拦登录。这就比较难做,解决方法1:我们用Selenium去手动输入验证码;方法2:我们用一些图像处理的库自动识别验证码(tesserocr/pytesserart/pillow)。
ip限制。如果这个IP地址,爬取网站频次太高,那么服务器就会暂时封掉来自这个IP地址的请求。 解决方法:使用time.sleep()来对爬虫的速度进行限制,建立IP代理池或者使用IPIDEA避免IP被封禁。
python 多线程 访问网站
#python2
#coding=utf-8
import?os,re,requests,sys,time,threading
reload(sys)
sys.setdefaultencoding('utf-8')
class?Archives(object):
????def?__init__(self,?url):
????????self.url?=?url
????
????def?save_html(self,?text):
????????fn?=?'{}_{}'.format(int(time.time()),?self.url.split('/')[-1])
????????dirname?=?'htmls'
????????if?not?os.path.exists(dirname):
????????????os.mkdir(dirname)
????????with?open(os.path.join(dirname,?fn),?'w')?as?f:
????????????f.write(text)
????????????
????def?get_htmls(self):
????????try:??????????????
????????????r?=??requests.get(self.url)
????????????r.raise_for_status()
????????????r.encoding?=?r.apparent_encoding
????????????print?'get?html?from?',?url
????????????self.save_html(r.text)
????????except?Exception,e:
????????????print?'爬取失败',e????????????
????def?main(self):
????????thread?=?threading.Thread(target=self.get_htmls())
????????thread.start()
????????thread.join()
if?__name__=='__main__':
????start=time.time()
????fn?=?sys.argv[1]?if?len(sys.argv)1?else?'urls.txt'
????with?open(fn)?as?f:
????????s?=?f.readlines()
????for?url?in?set(s):
????????a=Archives(url.strip())
????????a.main()????
????end=time.time()
????print?end-start