python爬虫小知识

一、如何控制好访问频率

import time
#设置休眠5s
time.sleep(5)

.二、如何修改headers
ps:(爬虫访问网站留下的是useragent是pythonx,别人一看就知道你是蜘蛛程序了~)
1、(方法一)通过字典的形式传参给request

head = {}
head['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
req = urllib.request.Request(url, data, head)

2、(方法二)request生成之后,add_header()动态追加

req = urllib.request.Request(url, data)
req.add_header('User-Agent',  'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36')

三、如何获取由javascript动态生成的网站数据
1、用selenium自动化测试框架
相关依赖:
(1)下载浏览器驱动

//查看浏览器版本好,打开浏览器输入:
chorome://version
//查看对应驱动的版本号
https://chromedriver.storage.googleapis.com/2.34/notes.txt
//下载对应版本驱动
https://chromedriver.storage.googleapis.com/index.html

(2)测试//控制台会输出html代码,整个Element页面的结构

from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://www.baidu.com')
html_text = browser.page_source
browser.quite()
print(html_text)

(3)分析Elements页面结构【采用BeautifulSoup解析】获取关键信息

soup = BeautifulSoup(html_text, 'html.parser'
ol = soup.find('ol', attrs={'class':'commentlist'})
href = ol.findAll('a', attrs={'class':'view_img_link'})
for a in href:
	print(a['href'])

四、识别验证码
(直接引用):参考 python 识别登陆验证码图片(完整代码)
https://blog.csdn.net/ever_peng/article/details/90547299
(1)导入库re、Image、pytesseract、selenium、time

import re 
from PIL import Image #用于打开图片和对图片处理
import pytesseract #用于图片转文字
from selenium import webdriver #用于打开网站
import time

(2)创建类,用于打开网页和定位验证码图片的元素
(3)打开浏览器,截取验证码图片
(4)灰度处理,用convert把图片转成黑白色,设置threshold阀值,超过阀值的设置成黑色
(5)去燥,删除扰乱识别的像素点
(6)最后把处理后的图片转成文字

五、如何克服ip限制
直接引用: https://www.cnblogs.com/IT-Scavenger/p/9883489.html
1、(方法一)伪造User-Agent
在请求头中把User-Agent设置成浏览器中的User-Agent,来伪造浏览器访问

headers = {'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'}
resp = requests.get(url,headers = headers)

还可以先收集多种浏览器的User-Agent,每次发起请求时随机从中选一个使用,可以进一步提高安全性:

import requests,random
user_agents = ['Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50','Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11']
def get_html(url):
    headers = {'User-Agent':random.choice(user_agents)}
    resp = requests.get(url,headers = headers)
    return resp.text

把上面随机选择一个User-Agent的代码封装成一个函数:

import random
def get_headers():
    '''
    随机获取一个headers
    '''
    user_agents =  ['Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50','Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11']
    headers = {'User-Agent':random.choice(user_agents)}
    return headers

注:一些常见浏览器的User-Agent可参见:https://blog.csdn.net/qianxing111/article/details/79415857
2、(方法二)在每次重复爬取之间设置一个随机时间间隔

#比如:
time.sleep(random.randint(0,3))  # 暂停0~3秒的整数秒,时间区间:[0,3]
#或:
time.sleep(random.random())  # 暂停0~1秒,时间区间:[0,1)

3、(方法三)伪造cookies
若从浏览器中可以正常访问一个页面,则可以将浏览器中的cookies复制过来使用,比如:

cookies = dict(uuid='b18f0e70-8705-470d-bc4b-09a8da617e15',UM_distinctid='15d188be71d50-013c49b12ec14a-3f73035d-100200-15d188be71ffd')
resp = requests.get(url,cookies = cookies)
# 把浏览器的cookies字符串转成字典
def cookies2dict(cookies):
    items = cookies.split(';')
    d = {}
    for item in items:
        kv = item.split('=',1)
        k = kv[0]
        v = kv[1]
        d[k] = v
    return d

注:用浏览器cookies发起请求后,如果请求频率过于频繁仍会被封IP,这时可以在浏览器上进行相应的手工验证(比如点击验证图片等),然后就可以继续正常使用该cookies发起请求。
4、(方法四)使用代理
可以换着用多个代理IP来进行访问,防止同一个IP发起过多请求而被封IP,比如:

proxies = {'http':'http://10.10.10.10:8765','https':'https://10.10.10.10:8765'}
resp = requests.get(url,proxies = proxies)
# 注:免费的代理IP可以在这个网站上获取:http://www.xicidaili.com/nn/

附:GitHub上的一个"反反爬虫"项目
道高一尺魔高一丈,你有反爬虫措施,那我也有各种"反反爬虫"的措施,GitHub上就有一位大神专门整理了一个这样的项目:Anti-Anti-Spider,链接地址为:
https://github.com/luyishisi/Anti-Anti-Spider

参考(摘录):
https://blog.csdn.net/Aka_Happy/article/details/82751789
https://blog.csdn.net/coder_pig/article/details/79015632
https://blog.csdn.net/ever_peng/article/details/90547299
https://www.cnblogs.com/IT-Scavenger/p/9883489.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值