一次性付费进群,长期免费索取教程,没有付费教程。
 
   进微信群回复公众号:微信群;QQ群:460500587
 
    
     教程列表  
    见微信公众号底部菜单 |  
     本文底部有推荐书籍  
    
   ![]()
 
   微信公众号:计算机与网络安全
 
   ID:Computer-network
 
   
 
    
    在使用爬虫抓取有效数据时,有些网站用Python并不能直接获取数据。有的是需要指定User-Agent的信息(Python默认会声明自己为Python脚本),有的是需要cookie数据,还有的网站因为一些缘故无法直接访问的还需要加上代理,这时就需要在Pyspider中添加、修改headers数据加上代理,然后向服务器提出请求。相比Scrapy而言,Pyspider修改headers,添加代理更加方便简洁。毕竟Scrapy还需要修改中间件,而Pyspider更加类似bs4,直接在源码中修改就可以达到目的。 
    
    
    
    
    
    
    以音悦台网站为目标,在音悦台中获取实时动态的音乐榜单。音悦台中的实时动态榜单有5个,这里只爬内地篇的榜单,如图1所示。 
    
   ![]()
 
    
    
    
    从图1中可以看出,这个实时的榜单有3页,共50首歌曲。只需要获取当前榜单的歌曲名、歌手名、评分以及当前排名就可以了。打开页面编码,找到所需数据的位置,如图2所示。 
    
   ![]()
 
    
    
    
    爬虫 
    所需的所有数据都在<li class="vitem J_li_toggle_date " name="dmvLi">这个标签里,只需要定位一次,就可以得到所有数据了。 
    
    
    
    
    
    这个页面写得非常标准,可以很容易地根据特征标签获取到想要的数据,该爬虫的alpha版本如图3所示。 
    
   ![]()
 
    
    
    
    单击网页左侧页面预览区右上方的Run按钮测试一下。如图3所示,爬虫运行正常。现在为这个爬虫加上headers和proxy(通常为爬虫加载headers和proxy是因为页面不能返回数据或者是为了反爬虫需要,本例中页面是可以正常返回的,加载headers和proxy只是为了做演示)。为爬虫加载headers和proxy很简单,只需要在crawl_config中添加相应的值就可以了。一般情况下headers中只需要添加User-Agent就可以了,但有的网页也许会限制比较严格,这里添加的headers比较详细。Proxy只需要给一个可以使用的代理就可以了。单击左侧页面预览区右上方的Run按钮测试一下,如图4所示。 
    
   ![]()
 
    
    
    
    在浏览器中可以打开页面而爬虫无法得到数据,一般加载headers就可以解决问题了。浏览器需要使用proxy才能打开的页面,爬虫也需要加载proxy才能得到数据。如果网站中设置了反爬虫,过滤频繁发送请求的IP的情况下怎么办呢?正常的应对方法是使用多个代理服务器进行轮询。通过网络搜索得到为Pyspider加载多个代理的方法是使用squid轮询。这种方法是可以,但需要安装squid软件,而且squid设置起来也比较麻烦。这里采用更加简单的方法,只要在爬虫发送请求的部位,随机地从代理池中挑选一个代理就可以了(按顺序挑选也可以,这就相当于代理的轮询了)。因此,爬虫最终版本omega版的代码如下: 
    
    
    
 
    
    
    2    # -*- encoding: utf8 -*- 
    
    
    
    
    5    from pyspider.libs.base_handler import * 
    
    
    
    
    8    "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",       
    
 
    
    
    9    "Accept-Encoding":"gzip,deflate", 
    
 
    
    
    10    "Accept-Language":"en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7,zh-TW;q=0.6", 
    
 
    
    
    11    "Cache-Control":"max-age=0", 
    
 
    
    
    12    "Connection":"keep-alive", 
    
 
    
    
    13    "User-Agent":"Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/63.0.3239.84 Safari/537.36" 
    
 
    
    
    
    15    proxyList=["19.168.1.99:1080","101.68.73.54:53281",""] 
    
 
    
    
    16    class Handler(BaseHandler): 
    
 
    
    
    
    
    
    
    
    22    url='http://vchart.yinyuetai.com/vchart/trends?area=ML&page=' 
    
 
    
    
    
    
    
    26    self.urls.append(url+page)         
    
 
    
    
    
    
    
    30    self.crawl(url,callback=self.index_page, 
    
 
    
    
    31    proxy=random.choice(proxyList),headers=headers) 
    
    
    32    @config(age=10*24*60*60) 
    
 
    
    
    33    def index_page(self,response): 
    
    
    34    # for each in response.doc('a[href^="http"]').items(): 
    
 
    
    
    35    # self.crawl(each.attr.href,callback=self.detail_page) 
    
 
    
    
    36    Tags=response.doc('li[class="vitem J_li_toggle_date"]').items() 
    
 
    
    
    
    38    top_num=subTag('div[class="top_num"]').text() 
    
 
    
    
    39    mvname=subTag('a[class="mvname"]').text() 
    
    
    40    singer=subTag('a[class="special"]').text() 
    
    
    41    desc_score=subTag('h3[class="desc_score"]').text() 
    
    
    42    print('%s %s %s %s' %(top_num,mvname,singer,desc_score)) 
    
    
    
    44    def detail_page(self,response): 
    
 
    
    
    
    
    47    "title":response 
    .doc('title').text(), 
    
    
    
    
    当前爬虫只有index_page函数需要发送请求,因此,只需要在回调这个函数时随机挑选一个代理加入参数就可以了。 
    单击爬虫页面左侧预览栏右上方的Run按钮测试一下,结果如图5所示。 
    
   ![]()
 
    
    
    
    这里需要注意的是,代理池中的所有代理必须是可靠可用的。 
    为了安全起见,可以在爬虫中添加一个测试程序,在每次使用代理前做个测试。 
    如果网站是通过IP来判断用户身份的,就使用该代理IP。 
    如果是通过User-Agent来判断用户身份,那就轮询或者随机挑选User-Agent。 
    如果是通过Cookies来判断用户,那就轮询或随机选Cookies……总之,网站的反爬虫防哪一部分,爬虫就需要绕过这一部分。 
    
    
   微信公众号:计算机与网络安全
 
   ID:Computer-network