假期还剩 2 天,Python 爬取途牛网,揭秘哪里人少景美!
作者 | timber
本文经授权转自数据森麟(ID: shujusenlin)
责编 | 胡巍巍
五一假期还有两天,短途旅行依然来得及。
这里送给大家一个用于途牛网爬取旅行线路线获取的爬虫,预祝大家都度过一个愉快的五一假期。
本爬虫最先是用 Scrapy 写的,很多地方没完善好最终停歇了(定制起来比较难),笔者觉得用 Scrapy 展示出来并不是那么优雅,所以就拆了出来。主要运用到的知识点:PyQuery、Selenium、MySQL、ip_pool、进程,因为代理池是花了钱的,所以文中还是次要说一下方法就好了。免得一些调皮捣蛋的小伙伴瞎整。
页面分析
OK!进入正题,首先把该装的库装好,假设你在运行过程中出现 no model name xxxxx,你就 pip install xxxxx。首先来分析一波页面,罗列一下需要抓取的字段:
好的冷饭炒完,如果是新手,可以花个十来分钟去看一下https://blog.csdn.net/weixin_42946604/article/details/86346615 这个小教程,了解具体怎么分析网页。笔者此次采用了 Selenium+Chrome 来抓取,我把它归在一起了,大家可以浏览一下我这具体的 Chrome 选项参数(自带注释):
这里提一下 Selenium 防检测的问题(非必须),如果你抓取过X团外卖的话,你会发现使用 Selenium 直接打开网页去请求的话,会出现这种问题。当然你可以加载电脑上的 Chrome 浏览器路径进来。
我采用了遍历 url_list 来抓取多个链接,如果过多了不是那么好看。
你可以往里面继续加,然后使用 for 循环逐一去请求就好了,接着就是获取到旅游产品的页面数,再把每一页的数据下载下来交给 data_save() 方法处理
这样是不是一只爬虫就写好了呢!真的上手简单,实用性也高。
代理池处理
过程中建议也可以去买,钱不多,少抽一包烟 or 少撩一次妹一个稳定实用的代理池就有了。免费的代理,除了免费啥作用都起不到,而且很多小伙伴测试随机代理的时候,完整获得请求之后返回的结果,开心得不行了,但是不到一段功夫爬虫就嗝屁了。这种情况代理的匿名性也是很重要的。
假设1:你的代理已经在数据库中了,字段类似我这样的话,需要像这样拼接起来:
https://192.168.1.1:8080
我自己是在同一个文件夹下,另外创建了一个 PY 文件用于测试&获取代理
代理测试就是另一个小爬虫,使用代理去请求,例如你可以去请求这个http://www.ip138.com/(IP 地址查询),请求返回的结果需要做字符编码问题,该网站是使用 GB2312。
然后只要判断获取的 IP 不是你本机的就行了,我是这样做的:
我是每次抓取完一个产品就更换,换页不做更换。
JS 加载问题
这也是很常见的,不是所有情况下 bro.get(URL) 让返回结果,所有数据就都出来了,很多情况下数据是要触发事件来产生的,例如《刺激战场的官网》。
Selenium 的事件操作方法健全,让爬虫更像用户,让站长更分辨不清是真用户假用户,就让你抓狂!
我使用的方法还是挺老套的,直接 copy 我以前文章的代码,贴上来的:
数据存储
本文使用 PyMySQL,使用完随手关门习惯,“用完记得洗手【手动滑稽表情】”。
点火,出发!
让爬虫骑上你的大奔,轮子越多,跑得越快(当然要考虑到你电脑的处理能力):
笔者因为穷得叮当响只能开嘉陵摩托车,两轮!
点火,出发:
Tip:记得遵守交通规则,做个好市民哟
另附本文代码:https://pan.baidu.com/s/1TElQPWPG8ltudFP1pTo8bg 提取码: vwns
作者:timber ,在一家电子商务(外贸)公司任职运维,平常工作时我觉得敲命令的样子也很帅,个人博客地址 https://blog.csdn.net/weixin_42946604
【END】
作为码一代,想教码二代却无从下手:
听说少儿编程很火,可它有哪些好处呢?
孩子多大开始学习比较好呢?又该如何学习呢?
最新的编程教育政策又有哪些呢?
下面给大家介绍CSDN新成员:极客宝宝(ID:geek_baby)
戳他了解更多↓↓↓
热 文 推 荐
☞41 岁蚂蚁金服总裁助理去世; 华为首款 5G 手机欧洲上市;库克首谈 5G iPhone | 极客头条
☞ 阿里半跪过,任正非差点跳楼,京东被骗光钱:成年人的生活哪有容易二字?
☞强推!盘点阿里巴巴 15 款开发者工具 | 程序员硬核评测
☞17篇论文入选CVPR 2019,百度AI都在关注什么?(附论文地址)
System.out.println("点个在看吧!");
console.log("点个在看吧!");
print("点个在看吧!");
printf("点个在看吧!\n");
cout << "点个在看吧!" << endl;
Console.WriteLine("点个在看吧!");
Response.Write("点个在看吧!");
alert("点个在看吧!")
echo "点个在看吧!"