python爬虫爬取数据的方法(python网络爬虫爬取数据)
Python爬虫常用的几种数据提取方式
数据解析方式
- 正则
- xpath
- bs4
数据解析的原理:
标签的定位
提取标签中存储的文本数据或者标签属性中存储的数据
python爬取数据被限制有好的方法吗?
1. 使用更多的IP代理池:可以使用代理池来提高爬取的效率,更换不同的IP来避免被封禁;
2. 使用随机延迟爬取:爬虫程序可以在每次爬取之间设置一个随机时间延迟,以防止网站检测到大量请求;
3. 使用User Agent池:可以使用不同的User Agent来伪装爬取程序,以免被网站识别出来;
4. 使用cookie池:可以使用不同的cookie来伪装自己的请求,这样可以更好地模拟真实的浏览器行为,以免被网站发现;
5. 使用反爬虫技术:可以使用反爬虫技术,比如机器学习,识别爬虫行为,并相应地采取措施,比如封禁IP、限制访问速度等。
python爬取大量数据(百万级)
当用python爬取大量网页获取想要的数据时,最重要的问题是爬虫中断问题,python这种脚本语言,一中断
进程就会退出,怎么在中断后继续上次爬取的任务就至关重要了。这里就重点剖析这个中断问题。
第一个问题: 简单点的用动态代理池就能解决,在爬取大量数据的时候,为了速度不受影响,建议使用一些缓
存的中间件将有效的代理 ip 缓存起来,并定时更新。这里推荐 github 这个仓库
, 它会做ip有效性验证并将 ip 放入 redis ,不过实现过于复杂
了,还用到了 db ,个人觉得最好自己修改一下。困难点的就是它会使用别的请求来进行判断当前的ip是否
是爬虫,当我们过于聚焦我们的爬虫请求而忽略了其他的请求时,可能就会被服务器判定为爬虫,进而这个ip
会被列入黑名单,而且你换了ip一样也会卡死在这里。这种方式呢,简单点就用 selenium + chrome 一个一个
去爬,不过速度太慢了。还是自己去分析吧,也不会过复杂的。
第二个问题: 网络连接超时是大概率会遇到的问题,有可能是在爬取的时候本地网络波动,也有可能是爬
取的服务端对ip做了限制,在爬取到了一定量级的时候做一些延迟的操作,使得一些通用的 http 库超时
( urllib )。不过如果是服务端动的手脚一般延迟不会太高,我们只需要人为的设置一个高一点的
timeout 即可(30 秒),最好在爬取开始的时候就对我们要用的爬取库进行一层封装,通用起来才好改
动。
第三个问题: 在解析大量静态页面的时候,有些静态页面的解析规则不一样,所以我们就必须得做好断点
续爬的准备了( PS : 如果简单的忽略错误可能会导致大量数据的丢失,这就不明智了)。那么在调试的过
程中断点续爬有个解决方案,就是生产者和消费者分离,生产者就是产生待爬 url 的爬虫,消费者就是爬取
最终数据的爬虫。最终解析数据就是消费者爬虫了。他们通过消息中间件连接,生产者往消息中间件发送待
爬取的目标信息,消费者从里面取就行了,还间接的实现了个分布式爬取功能。由于现在的消费中间件都有
ack 机制,一个消费者爬取链接失败会导致消息消费失败,进而分配给其他消费者消费。所以消息丢失的
概率极低。不过这里还有个 tips , 消费者的消费超时时间不能太长,会导致消息释放不及时。还有要开启
消息中间价的数据持久化功能,不然消息产生过多而消费不及时会撑爆机器内存。那样就得不偿失了。
第四个问题: 这种情况只能 try except catch 住了,不好解决,如果单独分析的话会耗费点时间。但在
大部分数据 (99%) 都正常的情况下就这条不正常抛弃就行了。主要有了第三个问题的解决方案再出现这
种偶尔中断的问就方便多了。
希望能帮到各位。
python爬虫有几种方式???我知道可以用webdriver,urllib,requests这几种方法。
要全部罗列出来还真挺困难,很多非主流的模块也可以做爬虫。
大致分成3类:
1、类似urllib,requests,需要自行构造请求,组织url关联,抓取到的数据也要自行考虑如何保存。
2、类似selenium,模拟浏览器,大多用于爬取一些动态的网页内容,需要模拟点击,下拉等操作等。
3、类似scrapy 爬虫框架,相对来说更简单,进行一些配置,组织爬取的逻辑即可。
python爬虫---爬取LOL云顶之弈数据
本来是想爬取之后作最佳羁绊组合推算,但是遇到知识点无法消化(知识图谱),所以暂时先不组合了,实力有限
库的安装
1.requests? #爬取棋子数据
2.json? #棋子数据为js动态,需使用json解析
3.BeautifulSoup
实战前先新建个lol文件夹作为工作目录,并创建子目录data,用于存放数据。
1.爬取数据,新建个py文件,用于爬取云顶数据,命名为data.py
1.1定义个req函数,方便读取。//需设定编码格式,否则会出现乱码
def Re_data(url):
re = requests.get(url)
re.encoding = 'gbk'
data = json.loads(re.text)
return data['data']
1.2定义个Get函数,用于读取数据并使用保存函数进行保存数据,保存格式为json。
def Get_data():
# 获取数据并保存至data目录
base_url = ''
chess = Re_data(base_url + 'chess.js')
race = Re_data(base_url + 'race.js')
job = Re_data(base_url + 'job.js')
equip = Re_data(base_url + 'equip.js')
Save_data(chess,race,job,equip)
1.3定义save函数实现读取的数据进行文件保存,保存目录为工作目录下的data文件夹。
def Save_data(t_chess,t_race,t_job,t_equip):
with open('./data/chess.json','w') as f:
json.dump(t_chess,f,indent='\t')
with open('./data/race.json','w') as f:
json.dump(t_race,f,indent='\t')
with open('./data/job.json','w') as f:
json.dump(t_job,f,indent='\t')
with open('./data/equip.json','w') as f:
json.dump(t_equip,f,indent='\t')
1.4定义主函数main跑起来
if __name__ == '__main__':
start = time.time()
Get_data()
print('运行时间:' + str(time.time() - start) + '秒')
至此,数据爬取完成。
2.种族和职业进行组合。
2.1未完成 //未完成,使用穷举方法进行组合会出现内存不够导致组合失败(for循环嵌套导致数组内存超限)
//待学习,使用知识图谱建立组合优选,可参考:
期间遇到的问题:
1.爬取棋子数据时为动态js加载,需通过json模块的loads方法获取
2.3层for循环嵌套数据量大,导致计算失败,需优化计算方法。