爬虫小功能实现

在开发爬虫的过程中经常要实现一些小功能。因为每个功能都只是稍微了解即可满足需求,所以不对每一个功能单独写一个博文来介绍。

 

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中关于元素替换的一些总结

 

转载于:https://www.cnblogs.com/xingyucn/p/10205938.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值