昨天有这个需求,其实之前从来没用过Scrapy,简单花2个小时学习了一下使用方法,估计也有很多朋友和我有同样的需求,这里就总结一些我的经验。
安装之类的就不说了,通过pip即可。上手也很简单,看看官网教程的也写得很明白:
https://docs.scrapy.org/en/latest/intro/overview.html
唯一需要注意的一点是,实际上我们在使用爬虫的时候,相比正则表达式(Regular Expression),更常用XPath,估计很多朋友对XPath并不熟悉,我用一个例子说明一下:
例如我想在这样一个网页中:https://coinmarketcap.com/all/views/all/,获取所有加密货币的GitHub链接。注意到每种加密货币页面中,GitHub链接以这种形式存在(以Bitcoin为例):
<li><span class="glyphicon glyphicon-hdd text-gray" title="Source Code"></span> <a href="https://github.com/bitcoin/" target="_blank" rel="noopener">Source Code</a></li>
在爬虫中,我们就需要唯一地匹配到这里面的链接,其实匹配的方法很简单,先把代码放出来:
for each in response.xpath('//li/a[starts-with(@href,"https://github.com/")]/@href'):
XPath中几种重要的标签解释如下:
1) // 双斜杠 定位根节点,会对全文进行扫描,在文档中选取所有符合条件的内容,以列表的形式返回。
2) / 单斜杠 寻找当前标签路径的下一层路径标签或者对当前路标签内容进行操作
3) /text() 获取当前路径下的文本内容
4) /@xxxx 提取当前路径下标签的属性值
5) | 可选符 使用|可选取若干个路径 如//p | //div 即在当前路径下选取所有符合条件的p标签和div标签。
6) . 点 用来选取当前节点 7) .. 双点 选取当前节点的父节点
所以,我们首先通过//li定位到这一行,然后href前面的标签a,然后用starts-with方法提取以https://github.com/内容开头的href标签,匹配到了之后再取href的属性值即可。
其他的内容大家一看便知,关于XPath的详细解释,可以看看这里:https://blog.csdn.net/winterto1990/article/details/47903653
最后给出完整的示例代码:
import scrapy from scrapy.selector import Selector class CoinSpider(scrapy.Spider): name="coin" allowed_domains=["coinmarketcap.com"] start_urls = [ 'https://coinmarketcap.com/all/views/all/', ] def parse(self,response): for each in response.xpath('//li/a[starts-with(@href,"https://github.com/")]/@href'): github_url=each.extract() print github_url for each in response.xpath('//a/@href'): suburl=each.extract() if(suburl.startswith('/currencies/')): yield scrapy.Request('https://coinmarketcap.com'+suburl, self.parse)