scrapy实战二:欣欣旅游网西安景点的爬取
1.目标:名称 景点地址 票价 开放时间
2.分析:
需要点开具体景点进入景点界面才能获取全部目标
查看元素知道可以以https://xian.cncn.com/jingdian/作为入口链接,让spider 在这个界面获取到具体景点的链接,交给下载中间件,下载中间件动态获取到具体景点的网页内容后,返回给spider,完成具体的工作。
第一页与后面的页面布局有点不同,先来试试
scrapy shell + url
attention1: spot_list=response.xpath("//div[@class='city_spots_list']/ul/")#无效的xpath表达式,去掉ul后面#的'/' attention2: spot_list = response.xpath("//div[@class='city_spots_list']/ul/li") for i in spot_list: url =i.xpath("./a/@href").extract_first() print(str(url)) yield scrapy.Request(str(url), callback=self.parse, dont_filter=True) #我一开始spot_list的xpath之写到了ul,结果是只能获取bingmayong的信息,仔细想想,spot_list里面只有一个#ul,所以每次遍历都是在ul上的,而不是ul里li
xinxin_point.py的代码,
middleware.py的代码
按照上面的逻辑,代码上倒是没什么。运行,ok,第一页所有景点的信息成功获取。
接下来是下一页的操作
这次下一页是一个a标签,直接取出它的链接地址拼接一下就得到了,这里的if判断主要是控制是否到达最后一页,因为最后一页没有下一页这个标签,所以可以这样写。
然后就是存储数据了,和上一次差不多,没什么需要多说的,这次还是存入mysql。
爬虫运行完成,我看了看,报了一点错误
再往上看
应该是某次产生了 http://xian.cncn.com/jingdian// 这样的链接,而这个是我没有处理的,算是程序的bug。我算了一下景点数,一共是305个,而我数据库表里只有302条数据,而且个别数据有点奇怪,也许是布局独特吧——这里我不想去找了,就这样结束这次实践吧。
最后:这次爬取过程特别慢,因为每次都要打开新的网页,总用时(抱歉具体我没注意,运行的时候我出去打球了)差不多1个小时左右,所以以后想着怎么提速。也许可以换个爬取对象,毕竟我只需要一小部分数据,能找请求这些数据的链接就好了。