scrapy 抓取旅游网站
总结下最近工作,要抓取一些旅游网站上旅游产品的信息, 过程中主要使用Scrapy,定义简单的抓取规则,在一些地方也结合urllib2,BeautifulSoup。
1.锦江旅游:http://www.jinjiang.com/travel/
锦江旅游出发都是上海,目的地的选择如下图所示
1)url地址的特点
每个抓取网页的url结构为:
'http://www.jinjiang.com/travel/line/search?days=-1&departurePlaceEncode=%25E4%25B8%258A%25E6%25B5%25B7&keywordEncode=xxxx&sidx=&sord=&page=xxx'
修改请求参数keywordEncode和page获取不同的url
2)定义抓取规则
在具体页面在firebug查看各个节点的结构:
如上图所示:每个旅游产品的名称,链接和链接可通过下面方法获取:
titles = hxs.select('//div[@class="paragraph"]//span//h3//a/b/text()').extract()
links = hxs.select('//div[@class="paragraph"]//span//h3//a/@href').extract()
prices = hxs.select('//div[@class="centerCenterSectionChild"]/p[2]/a[1]/font/text()').extract()
...
2.上航旅游 :http://www.satrip.com/
1)出发地也是上海,获取各类产品(出境游,国内游,休闲度假)的目的地url:
获取了初步的url地址后,如出境游中的"马来西亚",其url为
http://www.satrip.com/Etravel/RouteList.asp?keyToCountry=%C2%ED%C0%B4%CE%F7%D1%C7&keyRouteArea=&keyRouteType=
需要进行后续操作,获取所有的url.在这里,结合了BeautifulSoup获取下一页的url(抓取时间超长....).
2)对不同的页面结构,定义不同抓取规则.....
3.春秋旅游:http://www.springtour.com/
1)春秋旅游网很多地方都采用javascript,在@yancl的指导下,通过firebug简单分析,获取json格式出发地与目的地的信息:
2)对于具体页面,http://www.springtour.com/Search/SearchAll?s=%u4E0A%u6D77&e=%u4E09%u4E9A,数据都通过post传输:
POST请求参数如下图:
通过修改出发地,目的地和page数获取各页面的数据
def get_data(vac_from,vac_to,page):
data = 'DepartureLocation=%s&DestinationLocation=%s&TravelMode=&InceptPrice=&FinishPrice=&DurationFrom=&DurationTo=&Interest=&OrderBy=0&CurPage=%d&SystemType=&Interest=&TrafficMode='%(vac_from,vac_to,int(page))
url = 'http://www.springtour.com/Search/GetTourAllLine'
rsp = urllib2.urlopen(url,data)
data = rsp.read()
return data
....
4.携程网:http://vacations.ctrip.com
1)不同的出发地有不同的旅游线路,出发地如下图所示:
以出发地为“北京”为例,http://vacations.ctrip.com/beijing,各个线路的url特点为:http://vacations.ctrip.com/whole-1Z1495-P-31-beijing-hainan,在http://vacations.ctrip.com/beijing上获取相同特点的url
在Scrapy中写一个获取url的spider:
class MySpider(CrawlSpider):
name = 'destination'
allowed_domains=['ctrip.com']
sites = open('/home/chenyp/myscrapy/test_scrapy/start_city.json','r')
citys = json.load(sites)
start_urls = []
for i in citys[:1]:
start_urls.append(i['url'])
rules = [Rule(SgmlLinkExtractor(allow=['/whole']),callback='myparse',)]#定义url的特点
def myparse(self,response):
......
2)获取url后,每个页面都具有相同的结构,容易定义规则进行抓取。
1.锦江旅游:http://www.jinjiang.com/travel/
锦江旅游出发都是上海,目的地的选择如下图所示
![]() |
锦江-目的地 |
1)url地址的特点
每个抓取网页的url结构为:
'http://www.jinjiang.com/travel/line/search?days=-1&departurePlaceEncode=%25E4%25B8%258A%25E6%25B5%25B7&keywordEncode=xxxx&sidx=&sord=&page=xxx'
修改请求参数keywordEncode和page获取不同的url
2)定义抓取规则
在具体页面在firebug查看各个节点的结构:
![]() |
节点路径 |
如上图所示:每个旅游产品的名称,链接和链接可通过下面方法获取:
titles = hxs.select('//div[@class="paragraph"]//span//h3//a/b/text()').extract()
links = hxs.select('//div[@class="paragraph"]//span//h3//a/@href').extract()
prices = hxs.select('//div[@class="centerCenterSectionChild"]/p[2]/a[1]/font/text()').extract()
...
2.上航旅游 :http://www.satrip.com/
1)出发地也是上海,获取各类产品(出境游,国内游,休闲度假)的目的地url:
![]() |
上航-目的地 |
获取了初步的url地址后,如出境游中的"马来西亚",其url为
http://www.satrip.com/Etravel/RouteList.asp?keyToCountry=%C2%ED%C0%B4%CE%F7%D1%C7&keyRouteArea=&keyRouteType=
需要进行后续操作,获取所有的url.在这里,结合了BeautifulSoup获取下一页的url(抓取时间超长....).
![]() |
2)对不同的页面结构,定义不同抓取规则.....
3.春秋旅游:http://www.springtour.com/
1)春秋旅游网很多地方都采用javascript,在@yancl的指导下,通过firebug简单分析,获取json格式出发地与目的地的信息:
![]() |
出发地与目的地 |
2)对于具体页面,http://www.springtour.com/Search/SearchAll?s=%u4E0A%u6D77&e=%u4E09%u4E9A,数据都通过post传输:
![]() |
POST请求参数如下图:
![]() |
通过修改出发地,目的地和page数获取各页面的数据
def get_data(vac_from,vac_to,page):
data = 'DepartureLocation=%s&DestinationLocation=%s&TravelMode=&InceptPrice=&FinishPrice=&DurationFrom=&DurationTo=&Interest=&OrderBy=0&CurPage=%d&SystemType=&Interest=&TrafficMode='%(vac_from,vac_to,int(page))
url = 'http://www.springtour.com/Search/GetTourAllLine'
rsp = urllib2.urlopen(url,data)
data = rsp.read()
return data
....
4.携程网:http://vacations.ctrip.com
1)不同的出发地有不同的旅游线路,出发地如下图所示:
![]() |
以出发地为“北京”为例,http://vacations.ctrip.com/beijing,各个线路的url特点为:http://vacations.ctrip.com/whole-1Z1495-P-31-beijing-hainan,在http://vacations.ctrip.com/beijing上获取相同特点的url
在Scrapy中写一个获取url的spider:
class MySpider(CrawlSpider):
name = 'destination'
allowed_domains=['ctrip.com']
sites = open('/home/chenyp/myscrapy/test_scrapy/start_city.json','r')
citys = json.load(sites)
start_urls = []
for i in citys[:1]:
start_urls.append(i['url'])
rules = [Rule(SgmlLinkExtractor(allow=['/whole']),callback='myparse',)]#定义url的特点
def myparse(self,response):
......
2)获取url后,每个页面都具有相同的结构,容易定义规则进行抓取。
还没人转发这篇日记