爬虫10.20

1.请求库,解析库,数据库

#抓包工具:Fiddler;mitmproxy(中间人插件)
#请求方式:
get: ?key=value&key1=value1
post:   
    请求体:formdata;
            json
            files
            
请求头:headers
	Cookie:主要记录用户保存信息
	User-Agent:用户身份
    Referer:从哪里来,防止盗链行为
	服务器自定义字段
#响应:
	Status Code:状态码
响应头:
	location:重定向的url;
    set-cookie:设置cookie;
    服务器特定字段

响应体:
	1.HTML代码
    2.二进制,图片,视频,音频
    3.json格式
    4.jsonp格式

2.爬虫与反爬虫对抗历史

检测:User-Agent;
(频率限制)误伤;
登录限制;注册账号,模拟登陆,携带Cookie;多账户登录;养账户
验证码:解析验证码,打码平台(机器学习+人工)
手机验证、邮箱验证;
只请求HTML,不请求jq,css
robots协议:失控爬虫
#常见反扒手段
1:检测User-Agent;
2.封禁IP;西刺代理
3.图片验证码;打码平台
4.滑动模块,操作浏览器内核
5.js轨迹,验证人来行为,
6.前端反调试;F12
7.js加密

3.请求库(request)

3.1 get

#安装:pip install requests
get/post/request
#get请求
response = requests.get(url, params=None, **kwargs())
#参数
url
headers = {}
params = {}
cookies = {}
proxies = {}
timeout = 默认值
allow_redirects = False
import requests
url = 'http://httpbin.org/get?name=mac&age=20&params1=100'
params = {
    'params1':'params1',
    'params2':'params2',
}
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',
    'Cookie':'xxx',
    'Referer':'yyy',
}
cookies = {
    'ccc':'999',
}
proxies={
    'https':'http://120.78.225.5:3128'
}
r = requests.get(url=url,headers=headers,params=params,cookies=cookies,
                 proxies=proxies,timeout = 10,allow_redirects = False)

print(r.text)

3.2 post

响应对象 = request.post()
#参数
url:
headers = {}
cookies = {}
data = {}
json = {}
files = {"file":"open('路径','rb')"}
timeout = 0.5
allow_redirects = False
import requests
url = 'http://httpbin.org/post'
data = {
    'name':'mac',
}
# json = {
#     'age':20,
# }
files = {
    'file':open('1.txt','rt',encoding='utf-8')
}
r = requests.post(url=url,data=data,files=files)

print(r.text)

#响应
r.url 请求url
r.text 获取的请求体文本信息
r.encoding = 'gbk' 获取解码格式
r.content 获得二进制
r.json() [json.loads(r.text)]
r.status_code
r.headers
r.cookies 获取cookie
r.history [响应对象1,响应对象2]

4. session和cookie

import requests
import http.cookiejar as cookiejar
session = requests.session()
session.cookies = cookiejar.LWPCookieJar()

r = session.get('http://www.baidu.com')
session.cookies.save('1.txt')

import requests
import http.cookiejar as cookiejar
session = requests.session()
session.cookies = cookiejar.LWPCookieJar()

session.cookies.load('1.txt')
print(session.cookies)

5. 解析语法

#常见解析:pyquery,re,bs4,lxml
#安装 pip install requests_html

#解析语法:
#CSS选择器:
1.类选择器 .类名
2.id选择器 #id值
3.标签选择器: 标签名
4.后代选择器 选择器1 选择器2
5.子代选择器 选择器1 > 选择器2
6.属性选择器 [属性名]
[属性名=属性值]
[属性名…^=属性值]
[属性名$=属性值]
[属性名*=属性值]
7.群组选择器:
选择器1,选择器2,... or
8.多条件选择器
选择器1选择器2,... and
#xpath选择器:

#xpath选择器

6. requests_html

import requests_html
url = 'http://www.xiaohuar.com'
# html = requests_html.HTML()

session = requests_html.HTMLSession()
# session.get(url=url)
# session.post()
r = session.request('get',url=url)
print(r.html)


#html对象属性
r.html.absolute_links 绝对路径
r.html.links 原样输出
r.html.base_url 默认的根路径
r.html.html 获取HTML页面
r.html.text 获取 HTML标签中的文本信息
r.html.encoding= 'gbk' 设置编码格式
r.html.raw_html 获取r.content
r.html.pq 获取pyquery对象

import requests_html
url = 'http://www.xiaohuar.com'
session = requests_html.HTMLSession()
r = session.request('get',url=url)
# print(r.html.absolute_links)
# print(r.html.links)
# print(r.html.base_url)
# r.html.encoding = ''
# print(r.html.html)
# print(r.html.text)
print(r.html.raw_html)
# print(r.html.pq)

requests方法:
r.html.find('css选择器')
r.html.find('css选择器',first=True)

r.html.xpath('xpath选择器')
r.html.xpath('xpath选择器',first=True)

r.html.search('模板') #result对象
r.html.search_all('模板')
r.html.render(......)
#参数:
script:"""
() =>
	js代码
"""
    scrolldow:n  向下翻几页
        sleep:n	 睡几秒	
keep_page:True/False

import requests_html
url = 'https://baike.baidu.com/item/视频'
session = requests_html.HTMLSession()
r = session.request('get',url=url)
# print(r.html.html)
# print(r.html.find('img'))
# print(r.html.find('[name="word"]'))

print(r.html.search('<button class="{}"><em></em><span>{}</span></button>'))
print(r.html.search('<button class="{}"><em></em><span>{}</span></button>')[1])
print(r.html.search('<button class="{}"><em></em><span>{content}</span></button>')['content'])

#element对象与方法:
.absolute_links
.links
.html
.attrs,
.find('css选择器')
.search('模板')
.search_all('模板')

import requests_html
url = 'https://baike.baidu.com/item/视频'
session = requests_html.HTMLSession()
r = session.request('get',url=url)
print(r.html.find('[class="para-title level-2"] h2 span',first=True))

6.1 render

#render安装及其报错处理,参考如下博客:
#https://blog.csdn.net/weixin_30426957/article/details/101439477
#JS注入

session = HTMLSession(
    browser_args=[
        '--no-sand',
        '--user-agent=xxxxx',
    ],headless=False
)

()=>{
Object.defineProperties(navigator,{
        webdriver:{
        get: () => undefined
        }
    })

#与浏览器进行交互
asynic def xxx():
    
	await r.html.page.XXX
    
	session.loop.run....(xxx())
    
	.screenshot({'path':路径})

	.evaluate('''() =>{js代码}’‘’})

	.cookies()

	.type('css选择器',’内容‘,{’delay‘:100})

	.click('css选择器')

	.focus('css选择器') 聚焦

	.hover('css选择器')

	.waitForSelector('css选择器')

	.waitFor(1000)

from requests_html import HTMLSession, HTML
session = HTMLSession(
    browser_args=[
        '--no-sand',
        '--user-agent=XXXXX',
    ], headless=False
)
url = 'https://baike.baidu.com/item'
r = session.request('get', url=url)
url = 'https://www.baidu.com'
r = session.get(url=url)
r.html.render(keep_page=True, sleep=1)

6.2键盘事件

.down('Shift')
.up('Shift')
.press('ArrowLeft')
.type('喜欢你啊',{‘delay’:100})

6.3鼠标事件

	.click(x,y,{
                'button':'left',
                'click':1
                'delay':0
			})
			.down({'button':'left'})
			.up({'button':'left'})
			.move(x,y,{'steps':1})

from requests_html import HTMLSession, HTML
session = HTMLSession(
    browser_args=[
        '--no-sand',
        '--user-agent=XXXXX',
    ], headless=False
)
url = 'https://baike.baidu.com/item'
r = session.request('get', url=url)
url = 'https://www.baidu.com'
r = session.get(url=url)
r.html.render(keep_page=True, sleep=1)

async def run():
    #交互语句
    # mydic = await r.html.page.evaluate('''() =>{
    # var a = document.querySelector('#kw')
    # var b = a.getBoundingClientRect()
    # return {'x':b.x,'y':b.y , 'width':b.width , 'height':b.height }
    # }''')
    # print(mydic)
    # await r.html.page.screenshot({'path':'1.png','clip':mydic})
    # await r.html.page.type('#kw','东京热',{'delay':400})
    # await r.html.page.hover('li[class="category-item"]')
    # await r.html.page.focus('#login_field')
    # await r.html.page.keyboard.type('935938484@qq.com')
    # await r.html.page.focus('#password')
    # await r.html.page.keyboard.type('a-new-world')
    # await r.html.page.click('[name="commit"]',{'button':'left'})
    await r.html.page.keyboard.type('喜欢你啊aaaaa')
    await r.html.page.keyboard.down('Shift')
    for i in range(5):
        await r.html.page.waitFor(100)
        await r.html.page.keyboard.press('ArrowLeft')
    await r.html.page.keyboard.up('Shift')
    await r.html.page.keyboard.press('Backspace')
    await r.html.page.waitFor(5000)
try:
    session.loop.run_until_complete(run())
finally:
    session.close()

7.数据库

查看数据库
show dbs 查看数据库

切换数据库
use db_name 切换数据库

增加数据库
db.table1.insert({'a':1})  创建数据库(切换到数据库插入表及数据)

删除数据库
db.dropDatabase()  删数据库(删前要切换)

5.表

使用前先切换数据库

查看表
show tables 查所有的表

增加表
db.table1.insert({'b':2})  增加表(表不存在就创建)

删除表
db.table1.drop()    删表

数据

db.test.insert(user0)    插入一条
db.user.insertMany([user1,user2,user3,user4,user5])插入多条
db.user.find({'name':'alex'})   查xx==xx
db.user.find({'name':{"$ne":'alex'}})   查xx!=xx
db.user.find({'_id':{'$gt':2}})    查xx>xx
db.user.find({"_id":{"$gte":2,}})  查xx>=xx
db.user.find({'_id':{'$lt':3}})  查xx<xx
db.user.find({"_id":{"$lte":2}})  查xx<=xx
db.user.update({'_id':2},{"$set":{"name":"WXX",}})   改数据
db.user.deleteOne({ 'age': 8 })   删第一个匹配
db.user.deleteMany( {'addr.country': 'China'} )  删全部匹配
db.user.deleteMany({})  删所有

pymongo

conn = pymongo.MongoClient(host=host,port=port, username=username, password=password)
db = client["db_name"] 切换数据库
table = db['表名']
table.insert({})  插入数据
table.remove({})   删除数据
table.update({'_id':2},{"$set":{"name":"WXX",}})   改数据
table.find({})  查数据

posted @ 2019-10-23 15:23  海森t  阅读(30)  评论(0)    收藏  举报