志在指尖
用双手敲打未来

python爬虫(python爬虫ip)

python爬虫

爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者);它是一种按照一定的规矩,自动地抓取网络信息的程序或许脚本。
假如咱们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序便是一只小蜘蛛,他们沿着蜘蛛网抓取自己想要的猎物/数据。
爬虫的根本流程
网页的恳求与呼应
网页的恳求和呼应办法是Request和Response
Request:用户将自己的信息经过浏览器(socketclient)发送给服务器(socketserver)
Response:服务器接纳恳求,剖析用户发来的恳求信息,收到恳求信息后回来数据(回来的数据中或许包括其他链接,如:image、js、css等)
浏览器在接纳Response后,会解析其内容来显现给用户,而爬虫程序在模拟浏览器发送恳求然后接纳Response后,是要提取其中的有用数据。
建议恳求:Request
恳求的建议是运用http库向方针站点建议恳求,即发送一个Request
Request目标的作用是与客户端交互,收集客户端的Form、Cookies、超链接,或许收集服务器端的环境变量。
Request目标是从客户端向服务器宣布恳求,包括用户提交的信息以及客户端的一些信息。客户端可经过HTML表单或在网页地址后面提供参数的办法提交数据。
然后服务器经过request目标的相关办法来获取这些数据。request的各种办法主要用来处理客户端浏览器提交的恳求中的各项参数和选项。
Request包括:恳求URL、恳求头、恳求体等
Request恳求办法:GET/POST
恳求url:url全称统一资源定位符,一个网页文档、一张图片、一个视频等都可以用url仅有来确定
恳求头:User-agent:恳求头中假如没有user-agent客户端装备,服务端或许将你当做一个非法用户;
cookies:cookie用来保存登录信息
一般做爬虫都会加上恳求头
例如:抓取百度网址的数据恳求信息如下:
获取呼应内容
爬虫程序在发送恳求后,假如服务器能正常呼应,则会得到一个Response,即呼应;
Response信息包括:html、json、图片、视频等,假如没报错则能看到网页的根本信息。例如:一个的获取网页呼应内容程序如下:
importrequests
request_headers={
‘Accept’:’text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9′,
‘Cookie’:’BIDUPSID=088AEC1E85F75590978FB3643E131FBA;PSTM=1603682377;BD_UPN=12314753;BDUSS_BFESS=s877ukkvpiduup96naoovu0b94;__yjs_duid=1_04c448abb85383e7fef98fb64b828cce1611538687284;BAIDUID=C6421D51B2DBFF82716EE84B116A4EF8:FG=1;BDSFRCVID_BFESS=rqtOJeC62uF1xmOeQXfguRnVq2hi4t5TH6aINJzxxKt_7w4IsZNSEG0PVf8g0Kubuo1BogKKWeOTHx8F_2uxOjjg8UtVJeC6EG0Ptf8g0f5;H_BDCLCKID_SF_BFESS=tbCH_ItXfCP3JRnYb-Qoq4D_MfOtetJyaR0fKU7vWJ5TEJjz3tuabp_8Lx4H3bQNaHc3Wlvctn3cShPCy-7m-p_z-J6bK6jULNchMhrL3l02VMQae-t2ynLV5HAOW-RMW23U0l7mWPPWsxA45J7cM4IseboJLfT-0bc4KKJxbnLWeIJEjjChDTcyeaLDqbQX2COXsROs2ROOKRcgq4bohjPDynn9BtQmJJrtX4Jtb4oqE4FxQRoChlKJhJAO2JJqQg-q3R5lLt02VlQueq3vBP0Fbfv80x-jLIOOVn0MW-KVo-Jz5tnJyUPibtnnBnkO3H8HL4nv2JcJbM5m3x6qLTKkQN3T-PKO5bRu_CFbtC_hMD-6j6RV-tAjqG-jJTkjt-o2WbCQ-tjM8pcNLTDK5f5L2Mc9Klov5DvtbJrC-CosjDbmjqO1j4_PX46EhnvibN8fLKbY-McFVp5jDh34b6ksD-Rt5JQytmry0hvcQb5cShn9eMjrDRLbXU6BK5vPbNcZ0l8K3l02V-bIe-t2b6Qh-p52f6LjJbC83e;BDORZ=B490B5EBF6F3CD402E515D22BCDA1598;H_PS_PSSID=33425_33439_33258_33272_31660_33463_33459_33321_33264;BAIDUID_BFESS=983CAD9571DCC96332320F573A4A81D5:FG=1;delPer=0;BD_CK_SAM=1;PSINO=7;BDRCVFR[tox4WRQ4-Km]=mk3SLVN4HKm;BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm;BDRCVFR[CLK3Lyfkr9D]=mk3SLVN4HKm;BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm;BD_HOME=1;H_PS_645EC=0c49V2LWy0d6V4FbFplBYiy6xyUu88szhVpw2raoJDgdtE3AL0TxHMUUFPM;BA_HECTOR=0l05812h21248584dc1g38qhn0r;COOKIE_SESSION=1_0_8_3_3_9_0_0_7_3_0_1_5365_0_3_0_1614047800_0_1614047797%7C9%23418111_17_1611988660%7C5;BDSVRTM=1′,
‘Host’:’www.baidu.com’,
‘User-Agent’:’Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/88.0.4324.182Safari/537.36′}
response=requests.get(‘https://www.baidu.com/s’,params={‘wd’:’帅哥’},headers=request_headers)#params内部便是调用urlencode
print(response.text)
以上内容输出的便是网页的根本信息,它包括html、json、图片、视频等,如下图所示:
Response呼应后会回来一些呼应信息,例下:
1、呼应状态
200:代表成功301:代表跳转404:文件不存在403:权限502:服务器错误2、Responeheader
set-cookie:或许有多个,是来告知浏览器,把cookie保存下来3、preview是网页源代码
最主要的部分,包括了恳求资源的内容,如网页html、图片、二进制数据等4、解析内容
解析html数据:解析html数据办法有运用正则表达式、第三方解析库如Beautifulsoup,pyquery等
解析json数据:解析json数据可运用json模块
解析二进制数据:以b的办法写入文件
5、保存数据
爬取的数据以文件的形式保存在本地或许直接将抓取的内容保存在数据库中,数据库可以是MySQL、Mongdb、Redis、Oracle等……
写在最终
爬虫的总流程可以理解为:蜘蛛要抓某个猎物–>沿着蛛丝找到猎物–>吃到猎物;即爬取–>解析–>存储;
在爬取数据过程中所需参考东西如下:
爬虫框架:Scrapy恳求库:requests、selenium解析库:正则、beautifulsoup、pyquery存储库:文件、MySQL、Mongodb、Redis……python

python爬虫ip

可能在学习爬虫的时候,遇到许多的反爬的手段,封ip就是其中之一。
关于封IP的网站。需求许多的署理IP,去买署理IP,关于初学者觉得没有必要,每个卖署理IP的网站有的供给了免费IP,但是又很少,写了个IP署理池。学习应该就够了
ip署理池:
1,在各大网站爬去免费署理ip2,查看ip可用可用存入数据库1和23,在数据库1中拿出少数署理ip存入数据库2(便利保护)4,守时查看数据库1和数据库2的署理数量,以及是否可用5,调用端口
1,在各大网站爬去免费署理ip
1defIPList_61():2forqin[1,2]:3url=’http://www.66ip.cn/’+str(q)+’.html’4html=Requestdef.get_page(url)5ifhtml!=None:6#print(html)7iplist=BeautifulSoup(html,’lxml’)8iplist=iplist.find_all(‘tr’)9i=210foripiniplist:11ifi<=0:12loader=”13#print(ip)14j=015foripportinip.find_all(‘td’,limit=2):16ifj==0:17loader+=ipport.text.strip()+’:’18else:19loader+=ipport.text.strip()20j=j+121Requestdef.inspect_ip(loader)22i=i-123time.sleep(1)
多写几个这样的方法
2,查看ip可用可用存入数据库1,和2
3,在数据库1中拿出少数署理ip存入数据库2(便利保护)
definspect_ip(ipprot):
2time.sleep(1)
3herder={
4″User-Agent”:”Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/62.0.3202.94Safari/537.36″,
5’Accept-Encoding’:’gzip,deflate’,
6’Accept-Language’:’zh-CN,zh;q=0.9′,
7’Accept’:’text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8′,
8’Upgrade-Insecure-Requests’:’1′
9
10}
11
12url=’https://www.baidu.com’
13proxies={“http”:”http://”+str(ipprot)}
14request=requests.get(url,headers=herder,proxies=proxies)
15ifrequest.status_code==200:
16print(‘可用署理’+ipprot)
17ifDb.r.llen(‘Iplist’)<=50:
18Db.add_ip(ipprot)
19#Alt.iplist.append(ipprot)
20
21else:
22Db.add_ips(ipprot)
23else:
24print(‘不可用署理’+ipprot)
我这里是用的www.baidu.com检测的给主IP的数据库长度是50(太多了不好保护)
4,守时查看数据库1和数据库2的署理数量,以及是否可用
#查看ip池数量
deftime_ip():
whileTrue:
time.sleep(5)
Db.act_lenip()
#查看备用池数量
deftime_ips():
whileTrue:
time.sleep(30)
#当备用池数量小于100再次获取
ifDb.len_ips()<100:
print(‘填数据’)
Acting_ip.iplist()
#程序入口
if__name__==’__main__’:
t1=threading.Thread(target=time_ip)
t1.start()
t2=threading.Thread(target=time_ips)
t2.start()
t1.join()
t2.join()
给他2个线程
Db.py
1#coding:utf-8
2importredis
3importRequestdef
4r=redis.Redis(host=’127.0.0.1′,port=6379)#host后的IP是需求衔接的ip,本地是127.0.0.1或许localhost
5#主ip池
6defadd_ip(ip):
7r.lpush(‘Iplist’,ip)
8#备用ip池
9defadd_ips(ip):
10r.lpush(‘Iplists’,ip)
11#备用ip池第一个开端取出
12defapp_ips():
13i=str(r.lindex(‘Iplists’,1),encoding=’utf-8′)
14r.lrem(‘Iplists’,i,num=0)
15returni
16deflen_ips():
17returnr.llen(‘Iplists’)
18deflen_ip():
19returnr.llen(‘Iplist’)
20#第一个开端取出
21defapp_ip():
22i=str(r.lpop(‘Iplist’),encoding=’utf-8′)
23returni
24#取出从最终一个开端
25defrem_ip():
26i=str(r.rpop(‘Iplist’),encoding=’utf-8′)
27returni
28#查看主ip池
29defact_db():
30foriinrange(int(r.llen(‘Iplist’)/2)):
31Requestdef.inspect_ip(rem_ip())
32
33#如果ip池数量少于25个则填满
34defact_lenip():
35ifr.llen(‘Iplist’)<25:
36print(‘填ip’)
37whiler.llen(‘Iplist’)<=50:
38Requestdef.inspect_ip(app_ips())
5,调用端口使用flask库创立接口
1fromflaskimportFlask
2importDb
3
4app=Flask(__name__)
5
6@app.route(‘/’,methods=[‘GET’])
7defhome():
8return’Whatis?’
9
10@app.route(‘/get’,methods=[‘GET’])
11defhomsse():
12returnDb.app_ip()
13#线程池数量
14@app.route(‘/count’,methods=[‘GET’])
15defhomsssse():
16returnstr(Db.len_ip())
17app.run(debug=True)

未经允许不得转载:IT技术网站 » python爬虫(python爬虫ip)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载