持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
背景
假如你总是爬百度,百度会生气,然后把ip拉黑,导致无法访问百度。所以有些时候需要一些代理,配置代理,让一些其他ip地址代理你去索取一些数据。然后再返回给你,你就是一个坏蛋。利用一个无知的孩子做一些坏事。
前几行是我的电脑不允许访问https,紧跟着的是一些必要url,header数据的准备,创建一个请求对象。然后生成一个handler,build_opener,最后open.就完事了。
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
import urllib.request
# 代理的基本使用
url='http://httpbin.org/ip'
headers = {
'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"
}
request = urllib.request.Request(url=url, headers=headers)
proxies={'http':'223.96.90.216:8085'}
handler = urllib.request.ProxyHandler(proxies=proxies)
opener = urllib.request.build_opener(handler)
response = opener.open(request)
content = response.read().decode('utf-8')
with open('ip.html', 'w', encoding='utf-8') as fp:
fp.write(content)
print(content)
其中的ip是来自快代理网站上的免费ip,免费ip的优先就是免费,不花钱。但是缺点就是大家都在用,不稳定,或者容易超时。 上面代码最后得到数据
代理池
一个代理总是爬百度,长此以往也不是办法。所以一般公司会有一个ip池。里面是所有的ip地址,然后爬数据时,不是只用一个ip去爬,而是随机使用,每个ip的概率都是随机的,然后就不会出现一个ip,短时间持续请求接口,就不会被检测出来。
proxies_pool=[
{
'http':'113.121.36.199:9999'
},
{
'http':'120.194.55.139:6969'
}
]
import random
proxies=random.choice(proxies_pool)
print(proxies)
爬虫的人真的好聪明啊。爬了数据还不让人发现。
xpath
解析html文件 安装 lxml
pip install lxml -i https://pypi.douban.com/simple
文件中引入
from lxml import etree
如果是解析本地文件的话,使用etreee.parse()方法,如果是服务器响应文件,需要使用etree.HTML()方法解析 例如:解析本地文件
from lxml import etree
# with open('./ip.html','r',encoding='utf-8')
tree=etree.parse("ip.html")
tree实例上面有xpath方法,接受一个路径参数。//代表任意,/代表子级别。 获取li
li_list=tree.xpath('//li')
查找所有有id的li标签,@代表是包含属性
li_list=tree.xpath('//ul/li[@id]')
路径后面跟着text方法可以获取节点里的内容
li_list=tree.xpath('//ul/li[@id]/text()')
print(li_list)
获取id为指定值的li的class的值
li_list=tree.xpath('//ul/li[@id="1"]/@class')
print(li_list)
获取id中包含l的li
li_list = tree.xpath('//ul/li[contains(@id,"l")]')
print(li_list)
获取id中以某个字符开始的li
li_list = tree.xpath('//ul/li[starts-with(@id,"b")]/text()')
print(li_list)
还有一些乱七把澡的方法。够用了