当爬虫遇到频繁登录
下方是对静态网页爬取的python代码(符合爬虫协议规定),注释阐释了我的思路以及碰到的一些问题
import requests
from lxml import etree
import time
import random
url = 'http://www.job5156.com/qiye/hebei-0/'
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36'
}
# 设置代理池 为防止网页出现 频繁登录 而不能获取部分源码的情况
procxy = [
{'https':'36.6.147.197:28546'},
{'https':'223.241.117.118:18118'},
{'https':'114.239.172.141:38001'},
{'https':'116.113.27.170:47849'},
{'https':'223.241.116.9:8010'}
]
#随机获取代理
http = random.choice(procxy)
#返回请求
response = requests.get(url = url,headers = headers,proxies = http)
random = random.randint(3,10)
# time.sleep(random) 之前出现频繁登录无法获得部分源码的情况: 1.未设置代理2.响应时间一直相同,被检测为机器人 结果是1影响的
#对html自动修正(如缺失节点可以自动填上),并构造一个xpath对象
html = etree.HTML(response.text)
# print(response.text)
#xpath对象可以获取节点
com_name = html.xpath('//div[@class = "line_com"]/a[@class = "com_name"]/text()')
com_job = html.xpath('//div[@class = "line_cate"]/a/text()')
# print(type(com_name),com_name) 可以发现com_name的类型是个list,com_job同理 那么我们可以进行遍历打印或者存储至文档及其他介质中
for i in range(0,len(com_name)):
print(str(i)+" "+com_name[i]+" "+com_job[i])
#上述是对第一页网页进行爬取,那么后面的网页可以发现规律,每点击 下一页 网页的路径会变,兄弟姐妹们实操下就能发现规律
for j in range(2,67):
#发现规律之后 对网页进行遍历 range的范围是[2,67),左闭右开 剩下的就是按上面的逻辑来了
url = 'http://www.job5156.com/qiye/hebei-0/pn'+str(j)
response = requests.get(url = url,headers = headers,proxies = http)
# time.sleep(random)
html = etree.HTML(response.text)
com_name = html.xpath('//div[@class = "line_com"]/a[@class = "com_name"]/text()')
com_job = html.xpath('//div[@class = "line_cate"]/a/text()')
for k in range(0,len(com_name)):
print(str(k)+" "+com_name[k]+" "+com_job[k])
拓展
1.西刺代理(https://www.xicidaili.com/)代码中代理池中的代理是从该网站得到的,当然还有其他免费代理
的网站,这些共享代理往往寿命较短,指不定哪天我代码中的失效了,可以尝试换下代理
2.对网页的遍历中 range(2,67)这是一段固定遍历,若网页内容(此网页内容是公司)增加或减少,该如何调节这个遍历数呢
3.其实代码中的 time.sleep(random) 只是延长了网站响应到下一步的过程,而不是让网站响应的时间随机,也就是说代码中的逻辑和我注释的逻辑(响应时间一直相同,被检测为机器人)是不一致的,希望别对大家造成影响
4.在对网页遍历的代码块会涉及到全局变量和局部变量的问题,因为这段代码我复制了上面那段,很多变量name是一致的,像这种做法有时候会存在全局变量引用问题
5.对可能出现异常的代码块加上except,对代码的维护性会更好
总结
这段代码展示的只是一种思路,它在我发布这段代码的时候还是可行的,或许在若干时间后,由于反爬机制,代理寿命
的丧失,网站的更改以及其他情况出现相关问题。爬虫与反爬一直处于博弈状态,它们都具有时效性,没有哪种爬虫或者反
爬永远可行,要想在这高速发展的互联网大环境下让自己的爬虫不被淘汰,更重要的是对反爬的理解,与时俱进,一步步突破
自己,才不会被大潮流所淹没。