在开发爬虫的过程中经常要实现一些小功能。因为每个功能都只是稍微了解即可满足需求,所以不对每一个功能单独写一个博文来介绍。
1. 爬虫程序随机暂停x秒
需要用到time和random两个python自建库。
用法:time.sleep(x) 程序暂停x秒
random.uniform(a, b):产生从a到b中的随机浮点数
random.random():产生从0到1中的随机浮点数,是uniform()中a=0、b=1的特别情况
random.randint(a, b):产生从a到b中的随机整数
random.randrange(a, b, c):产生从a到b间隔为c的随机整数
import time
import random
# 随机暂停时间为5到10中随机生成的浮点数
time.sleep(random.uniform(5, 10))
2. 连接本地MySQL,将数据写入数据库
python3上有pymysql库专门用于实现对MySQL的操作。
步骤:
1)pymysql.connect() 连接到本地MySQL
2)传入需要写入的数据到SQL语句中
3)提交SQL语句至MySQL执行
4)关闭MySQL连接
import pymysql
# 连接至本地数据库test数据库
db = pymysql.connect(host='localhost', user='username', password='password', db='test', port=3306)
# 获取游标。一切操作将借助游标完成
cursor = db.cursor()
try:
cursor.execute('DROP TABLE IF EXISTS tableone') # 执行一条删除tableone表的SQL语句
db.commit() # 提交至MySQL执行
print('create table done')
except:
db.rollback() # 执行失败,数据库回滚
print('create table not done')
cursor.close() # 关闭游标
db.close() # 关闭数据库连接
3. 使用IP代理池
爬取数据的过程中有时候会被目标站点封锁ip导致无法继续爬取。一个可行的解决办法是使用IP池。
使用requests库进行请求时,很简便就可以设置ip代理:
import requests
#设置代理
proxies={
'https': 'http://121.61.1.2:9999'
}
#使用代理IP进行访问
res=requests.get(url,proxies=proxies)
## 如果是使用session进行会话维持
s = requests.Session() # 创建会话
s.proxies = { # 设置代理池
'HTTP': 'http://110.52.235.241:9999',
'HTTP': 'http://121.61.1.2:9999'
}
s.get('https://www.baidu.com') # 访问url
发现一个网络免费代理ip站点:国内高匿代理IP
4. 随机选择User-Agent
一个常用的反爬策略就是对发起请求headers信息中的User-Agent进行检查。如果UA信息缺失,或者同一UA同一ip地址访问频次过快,则容易触发目标站点反扒机制。
import random
def choose_ua():
# 每次调用此函数随机返回一个UA
ua = [
'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'
]
return random.choice(ua)
网络上有很多UA大全分享,这里随便贴一个链接以供参考:常见User-Agent大全
5. 字符串多值转换
部分网站的反爬措施包括,前端展示时将html代码转换为真实数据再进行展示,如:html代码中传输数据为2018,前端将8转换为7,在页面展示正确的数据:2017。
在DataFrame中,替换可以使用replace,支持多值替换;但若该列为object类型即字符串,需要使用df['A'].str.replace()方法进行转换,此时无法同df['A'].replace()一般实现多值转换。
关于df['A'].replace()方法可以参考:10.pandas的替换和部分替换(replace)
如:需要将字符串中的,4转为3并且3转为4。
这里想到了两种解决方法:
1. 使用中间值
先将3转为a,然后将所以的4转为3,再将所以的a转化为4。即达到了将3和4互相转换
df['A'] = df['A'].str.replace('3', 'a')
df['A'] = df['A'].str.replace('4', '3')
df['A'] = df['A'].str.replace('a', '4')
2. 使用string的maketrans()和translate()方法
先使用maketrans将需要转换的数值进行配对,再运用str.translate()进行替换
tran_table = ''.maketrans('34', '43')
df['A'] = df['A'].str.translate(tran_table)
找了很久才在网络上找到这个解决方法,十分感谢:python中关于元素替换的一些总结