爬虫
爬虫
1.xpath的使用定位标签
-
索引的定位[]
tree.xpath('//li[index]')定位Li标签下的第一个,xpath是从1开始定位的
-
属性定位
tree.xpath('//div[@class="song"]') 先定位标签为div再定位属性class=song
-
标签定位
tree.xpath('//head') tree.xpath('/html/head') 标签的定位如果是/开头表示从根标签开始定位,如果是//则表示为任意位置开始
-
模糊定位
tree.xpath('div[contains(@class,"ng")]') 先定为标签div,然后div中属性class中包含ng的标签 tree。xpath('div[starts-with(@class,"ta"]') 表示为div标签中属性class以他开头的标签
2.xpath中属性的提取
-
提取标签中的文本内容
tree.xpath('//a[@id="feng"]/text()')取直系的文本内容 //text()所有的文本内容
-
提取标签中属性的内容
tree.xpath('//a[@id="feng"]/@href')
-
-
requests中的高级用法,更换cookie
import requests from lxml import etree kv={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER"} sess=requests.session() url='https://xueqiu.com/' sess.get(url=url,headers=kv) url="https://xueqiu.com/statuses/hot/listV2.json?since_id=-1&max_id=55593&size=15" respones=sess.get(url=url,headers=kv).json() print(respones)
3.问题
再发送大量的请求的时候,经常会报出这样的一个错误:httpconnectionpoll
原因:
1. 每次数据传输前客户端和服务端会建立tcp连接,为了节省连接消耗默认为长连接keep——alive,即连接一次,传输多次
2. IP被封(可以使用代理IP池解决)
3. 请求的次数过多
解决的办法:
- 更换请求的ip
- 将请求头headers中的connection的值设置为close,表示请求成功后断开
headers={
'connection':"close"
}
- 每次请求之间用sleep进行间隔
4.爬虫的始终反爬机制
-
模拟登陆中涉及的反爬:
-
验证码
-
验证码的识别:
-
云打码
-
超级鹰
1.
2.下载实例文档
3.编辑示例代码
#!/usr/bin/env python # coding:utf-8 import requests from hashlib import md5 class Chaojiying_Client(object): def __init__(self, username, password, soft_id): self.username = username password = password.encode('utf8') self.password = md5(password).hexdigest() self.soft_id = soft_id self.base_params = { 'user': self.username, 'pass2': self.password, 'softid': self.soft_id, } self.headers = { 'Connection': 'Keep-Alive', 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)', } def PostPic(self, im, codetype): """ im: 图片字节 codetype: 题目类型 参考 http://www.chaojiying.com/price.html """ params = { 'codetype': codetype, } params.update(self.base_params) files = {'userfile': ('ccc.jpg', im)} r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers) return r.json() def ReportError(self, im_id): """ im_id:报错题目的图片ID """ params = { 'id': im_id, } params.update(self.base_params) r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers) return r.json() def transform_code_img(imgpath,imgtype): chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '96001') #用户中心>>软件ID 生成一个替换 96001 im = open(imgpath, 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要// return chaojiying.PostPic(im, imgtype)['pic_str']
-
打码兔
-
-
-
动态变化的请求参数
-
cookie
-
-
UA
-
robots
-
动态加载
-
图片的懒加载
-
代理
-
js加密
-
js混淆