Day03回顾
目前反爬总结
- 基于User-Agent反爬
1、发送请求携带请求头: headers={
'User-Agent' : 'Mozilla/5.0 xxxxxx'}
2、多个请求随机切换User-Agent
1、定义列表存放大量User-Agent,使用random.choice()每次随机选择
2、定义py文件存放大量User-Agent,使用random.choice()每次随机选择
3、使用fake_useragent每次访问随机生成User-Agent
* from fake_useragent import UserAgent
* ua = UserAgent()
* user_agent = ua.random
* print(user_agent)
- 响应内容前端做处理反爬
1、html页面中可匹配出内容,程序中匹配结果为空
* 响应内容中嵌入js,对页面结构做了一定调整导致,通过查看网页源代码,格式化输出查看结构,
* 更改xpath或者正则测试
2、如果数据出不来可考虑更换 IE 的User-Agent尝试,数据返回最标准
- 基于IP反爬
控制爬取速度,每爬取页面后随机休眠一定时间,再继续爬取下一个页面
代理IP
请求模块总结
- urllib库使用流程
# 编码
params = {
'':'',
'':''
}
params = urllib.parse.urlencode(params)
url = baseurl + params
# 请求
request = urllib.request.Request(url,headers=headers)
response = urllib.request.urlopen(request)
html = response.read().decode('utf-8')
- requests模块使用流程
url = baseurl + urllib.parse.urlencode({
dict})
html = requests.get(url,headers=headers).text
解析模块总结
- 正则解析re模块
import re
pattern = re.compile('正则表达式',re.S)
r_list = pattern.findall(html)
- lxml解析库
from lxml import etree
parse_html = etree.HTML(res.text)
r_list = parse_html.xpath('xpath表达式')
xpath表达式
- 匹配规则
1、节点对象列表
# xpath示例: //div、//div[@class="student"]、//div/a[@title="stu"]/span
2、字符串列表
# xpath表达式中末尾为: @src、@href、text()
- xpath高级
1、基准xpath表达式: 得到节点对象列表
2、for r in [节点对象列表]:
username = r.xpath('./xxxxxx') # 此处注意遍历后继续xpath
一定要以: . 开头,代表当前节点
Day04笔记
requests.get()参数
查询参数-params
- 参数类型
字典,字典中键值对作为查询参数
- 使用方法
1、res = requests.get(url,params=params,headers=headers)
2、特点:
* url为基准的url地址,不包含查询参数
* 该方法会自动对params字典编码,然后和url拼接
- 示例
import requests
baseurl = 'http://tieba.baidu.com/f?'
params = {
'kw' : '赵丽颖吧',
'pn' : '50'
}
headers = {
'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)'}
# 自动对params进行编码,然后自动和url进行拼接,去发请求
res = requests.get(baseurl,params=params,headers=headers)
res.encoding = 'utf-8'
print(res.text)
练习
把课程第1天中的 百度贴吧 抓取案例改为使用requests模块的params参数实现?
# 1、首先改为requests模块
import requests
def get_page(self,url):
html = requests.get(url,headers=self.headers).content.decode('utf-8')
return html
# 2、改为params参数(无须编码,无须拼接)
def get_page(self,params):
html = requests.get(self.url,params=params,headers=self.headers).content.decode('utf-8')
def main(self):
... ...
for page in range(begin, end + 1):
pn = (page - 1) * 50
params ={