python爬虫scrapy的LinkExtractor
使用背景:
我们通常在爬去某个网站的时候都是爬去每个标签下的某些内容,往往一个网站的主页后面会包含很多物品或者信息的详细的内容,我们只提取某个大标签下的某些内容的话,会显的效率较低,大部分网站的都是按照固定套路(也就是固定模板,把各种信息展示给用户),LinkExtrator就非常适合整站抓取,为什么呢?因为你通过xpath、css等一些列参数设置,拿到整个网站的你想要的链接,而不是固定的某个标签下的一些链接内容,非常适合整站爬取。
import scrapy
from scrapy.linkextractor import LinkExtractor class WeidsSpider(scrapy.Spider):
name = "weids"
allowed_domains = ["wds.modian.com"]
start_urls = ['http://www.gaosiedu.com/gsschool/'] def parse(self, response):
link = LinkExtractor(restrict_xpaths='//ul[@class="cont_xiaoqu"]/li')
links = link.extract_links(response)
print(links)
links是一个list

我们来迭代一下这个list
for link in links:
print(link)
links里面包含了我们要提取的url,那我们怎么才能拿到这个url呢?

直接在for循环里面link.url就能拿到我们要的url和text信息
for link in links:
print(link.url,link.text)

别着急,LinkExtrator里面不止一个xpath提取方法,还有很多参数。
>allow:接收一个正则表达式或一个正则表达式列表,提取绝对url于正则表达式匹配的链接,如果该参数为空,默认全部提取。
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractor import LinkExtractor class WeidsSpider(scrapy.Spider):
name = "weids"
allowed_domains = ["wds.modian.com"]
start_urls = ['http://www.gaosiedu.com/gsschool/'] def parse(self, response):
pattern = '/gsschool/.+\.shtml'
link = LinkExtractor(allow=pattern)
links = link.extract_links(response)
print(type(links))
for link in links:
print(link)
>deny:接收一个正则表达式或一个正则表达式列表,与allow相反,排除绝对url于正则表达式匹配的链接,换句话说,就是凡是跟正则表达式能匹配上的全部不提取。
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractor import LinkExtractor class WeidsSpider(scrapy.Spider):
name = "weids"
allowed_domains = ["wds.modian.com"]
start_urls = ['http://www.gaosiedu.com/gsschool/'] def parse(self, response):
pattern = '/gsschool/.+\.shtml'
link = LinkExtractor(deny=pattern)
links = link.extract_links(response)
print(type(links))
for link in links:
print(link)
>allow_domains:接收一个域名或一个域名列表,提取到指定域的链接。
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractor import LinkExtractor class WeidsSpider(scrapy.Spider):
name = "weids"
allowed_domains = ["wds.modian.com"]
start_urls = ['http://www.gaosiedu.com/gsschool/'] def parse(self, response):
domain = ['gaosivip.com','gaosiedu.com']
link = LinkExtractor(allow_domains=domain)
links = link.extract_links(response)
print(type(links))
for link in links:
print(link)
>deny_domains:和allow_doains相反,拒绝一个域名或一个域名列表,提取除被deny掉的所有匹配url。
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractor import LinkExtractor class WeidsSpider(scrapy.Spider):
name = "weids"
allowed_domains = ["wds.modian.com"]
start_urls = ['http://www.gaosiedu.com/gsschool/'] def parse(self, response):
domain = ['gaosivip.com','gaosiedu.com']
link = LinkExtractor(deny_domains=domain)
links = link.extract_links(response)
print(type(links))
for link in links:
print(link)

>restrict_xpaths:我们在最开始做那个那个例子,接收一个xpath表达式或一个xpath表达式列表,提取xpath表达式选中区域下的链接。
>restrict_css:这参数和restrict_xpaths参数经常能用到,所以同学必须掌握,个人更喜欢xpath。
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractor import LinkExtractor class WeidsSpider(scrapy.Spider):
name = "weids"
allowed_domains = ["wds.modian.com"]
start_urls = ['http://www.gaosiedu.com/gsschool/'] def parse(self, response):
link = LinkExtractor(restrict_css='ul.cont_xiaoqu > li')
links = link.extract_links(response)
print(type(links))
for link in links:
print(link)

>tags:接收一个标签(字符串)或一个标签列表,提取指定标签内的链接,默认为tags=(‘a’,‘area’)
>attrs:接收一个属性(字符串)或者一个属性列表,提取指定的属性内的链接,默认为attrs=(‘href’,),示例,按照这个中提取方法的话,这个页面上的某些标签的属性都会被提取出来,如下例所示,这个页面的a标签的href属性值都被提取到了。
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractor import LinkExtractor class WeidsSpider(scrapy.Spider):
name = "weids"
allowed_domains = ["wds.modian.com"]
start_urls = ['http://www.gaosiedu.com/gsschool/'] def parse(self, response):
link = LinkExtractor(tags='a',attrs='href')
links = link.extract_links(response)
print(type(links))
for link in links:
print(link)
前面我们讲了这么多LinkExtractor的基本用法,上面的只是为了快速试验,真正的基本用法是结合Crawler和Rule,代码如下
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractor import LinkExtractor
from scrapy.spiders.crawl import CrawlSpider,Rule class GaosieduSpider(CrawlSpider):
name = "gaosiedu"
allowed_domains = ["www.gaosiedu.com"]
start_urls = ['http://www.gaosiedu.com/']
restrict_xpath = '//ul[@class="schoolList clearfix"]'
allow = '/gsschool/.+\.shtml'
rules = {
Rule(LinkExtractor(restrict_xpaths=restrict_xpath), callback="parse_item", follow=True)
} def parse_item(self,response):
schooll_name = response.xpath('//div[@class="area_nav"]//h3/text()').extract_first()
print(schooll_name)
简单的说一下,上面我们本应该继承scrapy.Spider类,这里需要继承CrawlSpider类(因为CrawlSpider类也是继承了scrapy.Spider类),rules是基本写法,可不是随便哪个单词都可以的啊,而且注意rules必须是一个list或者dict,如果是tuple的话就会报错。里面的话Rule里面包含了几个参数,LinkExtractor就不在这里熬述了,看上面就行,至于其他的几个参数,可以看我们另外一篇博文:http://www.cnblogs.com/lei0213/p/7976280.html
python爬虫scrapy的LinkExtractor的更多相关文章
- python爬虫scrapy框架——人工识别登录知乎倒立文字验证码和数字英文验证码(2)
操作环境:python3 在上一文中python爬虫scrapy框架--人工识别知乎登录知乎倒立文字验证码和数字英文验证码(1)我们已经介绍了用Requests库来登录知乎,本文如果看不懂可以先看之前 ...
- python爬虫Scrapy(一)-我爬了boss数据
一.概述 学习python有一段时间了,最近了解了下Python的入门爬虫框架Scrapy,参考了文章Python爬虫框架Scrapy入门.本篇文章属于初学经验记录,比较简单,适合刚学习爬虫的小伙伴. ...
- python爬虫scrapy项目详解(关注、持续更新)
python爬虫scrapy项目(一) 爬取目标:腾讯招聘网站(起始url:https://hr.tencent.com/position.php?keywords=&tid=0&st ...
- python爬虫scrapy框架
Scrapy 框架 关注公众号"轻松学编程"了解更多. 一.简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量 ...
- Python爬虫Scrapy框架入门(0)
想学习爬虫,又想了解python语言,有个python高手推荐我看看scrapy. scrapy是一个python爬虫框架,据说很灵活,网上介绍该框架的信息很多,此处不再赘述.专心记录我自己遇到的问题 ...
- [Python爬虫] scrapy爬虫系列 <一>.安装及入门介绍
前面介绍了很多Selenium基于自动测试的Python爬虫程序,主要利用它的xpath语句,通过分析网页DOM树结构进行爬取内容,同时可以结合Phantomjs模拟浏览器进行鼠标或键盘操作.但是,更 ...
- 安装python爬虫scrapy踩过的那些坑和编程外的思考
这些天应朋友的要求抓取某个论坛帖子的信息,网上搜索了一下开源的爬虫资料,看了许多对于开源爬虫的比较发现开源爬虫scrapy比较好用.但是以前一直用的java和php,对python不熟悉,于是花一天时 ...
- Python 爬虫-Scrapy爬虫框架
2017-07-29 17:50:29 Scrapy是一个快速功能强大的网络爬虫框架. Scrapy不是一个函数功能库,而是一个爬虫框架.爬虫框架是实现爬虫功能的一个软件结构和功能组件集合.爬虫框架是 ...
- python爬虫scrapy学习之篇二
继上篇<python之urllib2简单解析HTML页面>之后学习使用Python比较有名的爬虫scrapy.网上搜到两篇相应的文档,一篇是较早版本的中文文档Scrapy 0.24 文档, ...
随机推荐
- Android Call requires API level 19 (current min is 15)
在 Android 应用开发时候,配置文件中声明了支持的Android系统范围: minSdkVersion 15targetSdkVersion 27 但是代码中需要使用的一个类 (android. ...
- 在git多分支repo仓库中彻底清除大文件
坑的由来 repo中不小心上传了许多测试生成的data.结果可想而知,原本只有代码的仓库突然间变得无比臃肿(或者是慢慢臃肿),从早期的几十MB,迅速飙升至1G. 到底发生了什么 早些时候我对git的原 ...
- [SHOI2015]脑洞治疗仪
嘟嘟嘟 这题其实就是一个线段树维护最大连续和的水题. 别的操作不说,操作1只要二分找区间前\(k\)个0即可. 需要注意的是,因为操作1两区间可能有交,因此要先清空再二分查询-- 复杂度\(O(n l ...
- ROS 创建服务和请求
教程 维基 http://wiki.ros.org/cn/ROS/Tutorials 快速过程 创建包 $ cd ~/catkin_ws $ mkdir ~/catkin_ws/src $ cd ~/ ...
- 吴恩达课后作业学习1-week4-homework-multi-hidden-layer -2
参考:https://blog.csdn.net/u013733326/article/details/79767169 希望大家直接到上面的网址去查看代码,下面是本人的笔记 实现多层神经网络 1.准 ...
- 请根据英文单词的第一个字母判断星期几,如果第一个字母是一样的,则继续判断第二个字母。例如如果第一个字母是S,则继续判断第二个字母,如果第二个字母是a,则输出“星期六”
请根据英文单词的第一个字母判断星期几,如果第一个字母是一样的,则继续判断第二个字母.例如如果第一个字母是S,则继续判断第二个字母,如果第二个字母是a,则输出“星期六”.星期的英文单词如下表所示. 星期 ...
- eclipse svn合并小结
合并时候,当前在哪个分支上,哪个分支即为“主干” 弱化主干 分支的概念.svn原则上并没有主干 分子 主 从的概念.从一个项目衍生(分支)出来的版本,都可以是主,也可以是从. 版本之间互相合并原理 文 ...
- 如何选择分布式事务形态(TCC,SAGA,2PC,补偿,基于消息最终一致性等等)
各种形态的分布式事务 分布式事务有多种主流形态,包括: 基于消息实现的分布式事务 基于补偿实现的分布式事务(gts/fescar自动补偿的形式) 基于TCC实现的分布式事务 基于SAGA实现的分布式事 ...
- 使用 $(function(){}) 时遇到的一个小bug及解决方法
在 $(function(){}) 中声明函数,在 $(function(){}) 外调函数,会报错 原因: 页面加载后,会先执行 $(function(){}) 外面的语句,再执行 $(functi ...
- 微信小程序web-view页面安卓下显示空白的解决办法!!!
web-view页面在你向地址拼接参数展示页面时,在安卓上有时会显示空白 解决方案: A: 普通不需要参数的话可以直接把地址写在src里,不要去在onLoad里获取你的全局变量后再赋值. B: 如果需 ...