scrapy框架之CrawlSpider全站自动爬取
全站数据爬取的方式
1.通过递归的方式进行深度和广度爬取全站数据,可参考相关博文(全站图片爬取),手动借助scrapy.Request模块发起请求。
2.对于一定规则网站的全站数据爬取,可以使用CrawlSpider实现自动爬取。
CrawlSpider是基于Spider的一个子类。和蜘蛛一样,都是scrapy里面的一个爬虫类,但 CrawlSpider是蜘蛛的子类,子类要比父类功能多,它有自己的都有功能------ 提取链接的功能LinkExtractor(链接提取器)。Spider是所有爬虫的基类,其设计原则只是为了爬取start_url列表中网页,而从爬取到的网页中提取出的url进行继续的爬取工作使用CrawlSpider更合适。
项目创建
#创建工程项目:项目名CrawlSpiderPro可自定义
scrapy startproject CrawlSpiderPro
#切换到当前工程目录下
cd CrawlSpiderPro
#创建爬虫文件,比普通的爬虫文件多了参数“-t crawl”
scrapy genspider -t crawl crawlSpiderTest www.xxx.com
#开启爬虫项目
scrapy crawl crawlSpiderTest
初始化爬虫文件解析
class CrawlspidertestSpider(CrawlSpider):
name = 'crawlSpiderTest'
allowed_domains = ['www.xxx.com']
start_urls = ['http://www.xxx.com/']
#爬虫规则rules指定不同的规则解析器,一个Rule就是一个解析规则,可以定义多个
rules = (
#Rule是规则解析器;
# LinkExtractor是连接提取器,提取符合allow规则的完整的url;
#callback指定当前规则解析器的回调解析函数;
#follow指定是否将链接提取器继续作用到链接提取器提取出的链接网页;
Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),
) def parse_item(self, response):
item = {}
#item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
#item['name'] = response.xpath('//div[@id="name"]').get()
#item['description'] = response.xpath('//div[@id="description"]').get()
return item
东莞阳光网(http://wz.sun0769.com/index.php/question/report?page=)全站爬取案例:
1.爬虫脚本crawlSpiderTest.py
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from CrawlSpiderPro.items import CrawlspiderproItem class CrawlspidertestSpider(CrawlSpider):
name = 'crawlSpiderTest'
# allowed_domains = ['www.xxx.com'] start_urls = ['http://wz.sun0769.com/index.php/question/report?page=']
#爬虫规则rules指定不同的规则解析器,一个Rule就是一个解析规则,可以定义多个
rules = (
#Rule是规则解析器;
# LinkExtractor是连接提取器,提取符合allow规则的完整的url;
#callback指定当前规则解析器的回调解析函数;
#follow指定是否将链接提取器继续作用到链接提取器提取出的链接网页;
#follow不指定默认False;
Rule(LinkExtractor(allow=r'page=\d+'), callback='parse_item', follow=False),#提取页码
Rule(LinkExtractor(allow=r'question/\d+/\d+.shtml'), callback='parse_detail'),#提取详细信息页面
) def parse_item(self, response):
print(response)
item = CrawlspiderproItem()
tr_list=response.xpath('//*[@id="morelist"]/div/table[2]/tbody/tr/td/table/tbody/tr') for tr in tr_list:
item['identifier']=tr.xpath('./td[1]/text()').extract_first()#解析编号
item['title']=tr.xpath('/td[2]/a[2]/text()').extract_first()#解析标题
yield item def parse_detail(self, response):
print(12345678765)
item = CrawlspiderproItem()
#xpath解析不识别tbody
item['identifier']=response.xpath('/html/body/div[9]/table[1]/tr/td[2]/span[2]/text()').extract_first().split(':')[-1]
item['content']="".join(response.xpath('/html/body/div[9]/table[2]//text()').extract()) yield item
crawlSpiderTest.py
2.itmes.py字段属性定义
import scrapy #也可以定义两个类分别存储,最后在和管道通过编号字段进行汇总对应,然后持久化存储
class CrawlspiderproItem(scrapy.Item): #编号
identifier=scrapy.Field()
#标题
title=scrapy.Field()
#内容
content=scrapy.Field()
pass
itmes.py
3.pipelines.py管道配置
#自定义持久化处理
class CrawlspiderproPipeline(object):
def process_item(self, item, spider):
print(item)
return item
pipelines.py
4.settings.py配置
#UA伪装
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
#robots协议
ROBOTSTXT_OBEY = False
#日志输出等级
LOG_LEVEL='ERROR' #开启管道
ITEM_PIPELINES = {
'CrawlSpiderPro.pipelines.CrawlspiderproPipeline': 300,
}
scrapy框架之CrawlSpider全站自动爬取的更多相关文章
- Scrapy 框架 CrawlSpider 全站数据爬取
CrawlSpider 全站数据爬取 创建 crawlSpider 爬虫文件 scrapy genspider -t crawl chouti www.xxx.com import scrapy fr ...
- Crawlspider的自动爬取
引子 : 如果想要爬取 糗事百科 的全栈数据的方法 ? 方法一 : 基于scrapy框架中的scrapy的递归爬取进行实现(requests模块递归回调parse方法) . 方法二 : 基于Crawl ...
- scrapy进阶(CrawlSpider爬虫__爬取整站小说)
# -*- coding: utf-8 -*- import scrapy,re from scrapy.linkextractors import LinkExtractor from scrapy ...
- (4)分布式下的爬虫Scrapy应该如何做-规则自动爬取及命令行下传参
本次探讨的主题是规则爬取的实现及命令行下的自定义参数的传递,规则下的爬虫在我看来才是真正意义上的爬虫. 我们选从逻辑上来看,这种爬虫是如何工作的: 我们给定一个起点的url link ,进入页面之后提 ...
- Scrapy框架学习(四)爬取360摄影美图
我们要爬取的网站为http://image.so.com/z?ch=photography,打开开发者工具,页面往下拉,观察到出现了如图所示Ajax请求, 其中list就是图片的详细信息,接着观察到每 ...
- scrapy框架基于CrawlSpider的全站数据爬取
引入 提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法 ...
- Scrapy框架之CrawlSpider
提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基 ...
- 16.Python网络爬虫之Scrapy框架(CrawlSpider)
引入 提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法 ...
- scrapy框架之CrawlSpider操作
提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基 ...
随机推荐
- tp3.2 事务 和 tp5.0事务
tp3.2: 来源:https://www.kancloud.cn/thinkphp-development/tp323/423369 和: https://blog.csdn.net/mengzuc ...
- StringBuilder、StringBuffer分析比较
StringBuilder.StringBuffer源码分析 StringBuilder源码分析 类结构 public final class StringBuilder extends Abstra ...
- java在指定区间内生成随机数
Random对象生成随机数 首先需要导入包含Random的包 import java.util.Random; nextInt(int)方法将生成0~参数之间的随机整数但不包括参数. 例如生成0~99 ...
- I/O多路复用之select,poll,epoll简介
一.select 1.起源 select最早于1983年出现在4.2BSD中(BSD是早期的UNIX版本的分支). 它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回 ...
- python连接mysql数据表查询表获取数据导入到txt中
import pymysql'''连接mysql数据表查询表获取数据导入到txt中'''#查询结果写入数据到txtdef get_loan_number(file_txt): connect = py ...
- 《PostgreSQL服务器编程》一一1.3 超越简单函数
本节书摘来自华章计算机<PostgreSQL服务器编程>一书中的第1章,第1.3节,作者:(美)Hannu Krosing, Jim Mlodgenski, Kirk Roybal 著,更 ...
- Vue.js中scoped引发的CSS作用域探讨
前言 在Vue.js的组件化开发中,常常会对某个组件的style标签加上scoped属性,如<style lang='less' scoped>,这样做的目的在于使这个组件的样式不能轻易在 ...
- 【STM32 .Net MF开发板学习-05】PC通过Modbus协议远程操控开发板
从2002年就开始接触Modbus协议,以后陆续在PLC.DOS.Windows..Net Micro Framework等系统中使用了该协议,在我以前写的一篇博文中详细记载了这一段经历,有兴趣的朋友 ...
- P3983 赛斯石(双背包)
这题不算难的,但是脑子真的特别乱.....传送门 \(Ⅰ.物品可以拆开来但船不能拆开来,所以1-10载重船的最大收益完全可以用背包求出来.\) \(Ⅱ.最后一定是选一些船走,而船的收益已经固定.所以用 ...
- 记一次jackson序列化Boolean的坑
@Data public class CouponTemplateDto { /** * 优惠券类型id */ private Long couponTypeId; /** * 优惠券模板id */ ...