Python数据采集与爬虫网络爬虫@IT·互联网

爬取trip advisor英文评论(二)

2017-04-12  本文已影响133人  谁占了我的一年的称号

书接上文,http://www.jianshu.com/p/331c25b86938
在抓包之后找到了评论的真实网址,接下来就是将真实网址构造出来然后交给解析函数来爬取了。

首先看一下真实的网址,跟后面的网页比较之后发现主要变化的就是两个地方

http://www.tripadvisor.cn/ExpandedUserReviews-g303685-d550738?target=415647093&context=1&reviews=415647093,414284826,413404545,413197151,412897038,412421700,412353818,411970335,411775304,411196496&servlet=Attraction_Review&expand=1
(1)target=?
(2)reviews= ?
变化的就是上述两个地方后面的数字,基本上这个数字都是在源代码里可以找得到,也许是时间,也许是编号啥的,但是在这里我也不知道是啥,反正在源代码里搜索之后

Paste_Image.png

再对比抓的包之后就发现了,target后面的接的是第一个数字,reviews后面跟的是所有的所有的数字。明白这里就好办了。

我明白了
    num1 = selector.xpath('//div[@class="col balance "]/div/div[@class="reviewSelector   track_back"]/@id')
    num2 = selector.xpath('//div[@class="col balance "]/div/div[@class="reviewSelector  "]/@id')

将所有取出之后格式如上图所示,再用正则表达式将数字匹配出来

    a=''.join(re.findall('\d+',str(info1)))
    b=','.join(re.findall('\d+',''.join(info2)))

a就是target后面的所根的数字,b就是reviews后面所根的数字了。
接下来的就简单了,将真实函数构造出来之后再以同样的方式解析出来,然后根据老套路选出要爬取的文字就好了。
这次的爬虫没有在scrapy框架下写的,因为想要理清思路,此外,还没搞明白如何在scrapy中添加cookies信息,按照网上的要么在setting中添加,要么在spider的框架中添加,但是都不行,有哪位知道的,烦请在下面指教一下。
照例附上代码:

import requests
from lxml import etree
import re
import time
def get_comment(url):
    time.sleep(5)
    headers = {'cookies信息' }
    html=requests.post(url,headers=headers).content #解析网页中的网址
    selector=etree.HTML(html)
    info1 = selector.xpath('//div[@class="col balance "]/div/div[@class="reviewSelector   track_back"]/@id')  
    info2 = selector.xpath('//div[@class="col balance "]/div/div[@class="reviewSelector  "]/@id')
    a=''.join(re.findall('\d+',str(info1)))   #target后面的数字
    b=','.join(re.findall('\d+',''.join(info2)))  #reviews后面的数字
    real_url= 'http://www.tripadvisor.cn/ExpandedUserReviews-g303685-d550738?target={}&context=1&reviews={},{}&servlet=Attraction_Review&expand=1'.format(a,a,b)  #构造出真实网址
    print(real_url)
    html=requests.post(real_url,headers=headers).content
    selector=etree.HTML(html)
    coms = selector.xpath('//div[@class="entry"]/p/text()')
    print(''.join(coms))  #在网页中评论会有分行,输出的会是列表,所以要统一一下


if __name__=='__main__':  #构造所有网页网址
    start_url=['http://www.tripadvisor.cn/Attraction_Review-g303685-d550738-Reviews-Mt_Huangshan_Yellow_Mountain-Huangshan_Anhui.html/BackUrl#REVIEWS']
    for i in range(10,1960,10):
        next_url='http://www.tripadvisor.cn/Attraction_Review-g303685-d550738-Reviews-or%s-Mt_Huangshan_Yellow_Mountain-Huangshan_Anhui.html/BackUrl#REVIEWS'%i
        start_url.append(next_url)
    for url in start_url:
        get_comment(url)

总结:
1.这类网站的难点在于抓包,除了自己找以外,还有flidder等工具,可以研究研究
2.如何将框架理顺,加入到scrapy中
3.下一步学学模拟登陆

上一篇下一篇

猜你喜欢

热点阅读