python多线程访问网页(python多线程请求接口)

http://www.itjxue.com  2023-03-28 12:07  来源:未知  点击次数: 

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

(责任编辑:IT教学网)

更多