一次性付费进群,长期免费索取教程,没有付费教程。
进微信群回复公众号:微信群;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