spider_day04

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表达式: 得到节点对象列表
2for 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 ={
   
            
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值