Scrapy基础(六)————Scrapy爬取伯乐在线一通过css和xpath解析文章字段
上次我们介绍了scrapy的安装和加入debug的main文件,这次重要介绍创建的爬虫的基本爬取有用信息
通过命令(这篇博文)创建了jobbole这个爬虫,并且生成了jobbole.py这个文件,又写了xpath和css的基本用法的博文
首先分析网页的结构和抓取流程:
1,下载start_urls,交给parse方法处理
2,parse处理,从中获取本页的文章url(以后获取到文章首图传递个自定义的parse_detail),和下一页的url
3,将下一页的url交给parse方法。继续进行1和2;将文章url传递给自定义的解析函数parse_detail
4,parse方法对下一页的url进行下载,自定义的parse_detial则通过css或者xpath 解析有用的信息传递给Item,次数两个操作是异步操作
以下是源码:
- # -*- coding: utf-8 -*-
- import scrapy
- import re
- from scrapy.http import Request
- class JobboleSpider(scrapy.Spider):
- name = "jobbole"
- allowed_domains = ["blog.jobbole.com"]
- start_urls = ['http://blog.jobbole.com/all-posts/']
- def parse(self, response):
- '''
- 进行两部操作:1,从页面抓取所有的文章url交给解析器进行解析这个页面的标题时间点赞数等
- 2,从页面抓取下一个页面的url 进行下载
- '''
- #从网页提取文章的URL,交给scrapy下载,并传递给parse_detail解析
- #css_urlsresponse.css('#archive .floated-thumb .post-thumb a ::attr(href)').extract()
- post_urls = response.xpath('/html/body/div[1]/div[3]/div/div/a/@href').extract()
- for url in post_urls:
- #同过scrapy的Request()下载,并且交给自定义的parse_detail解析
- #注意:在这里从网页上解析的url是全的url,不需要拼接,若不全则需要进行拼接
- #拼接通过 urllib库的parse中的urljoin("http://blog.jobbole.com/","110769")函数进行拼接
- yield Request(url,callback=self.parse_detail)
- #从网页获取下一页
- #css_next_url = response.css('.next.page-numbers::attr(href)').extract_first()
- next_url = response.xpath('/html/body/div[1]/div[3]/div[21]/a[4]/@href').extract_first()
- if next_url:
- yield Request(next_url,callback=self.parse)
- def parse_detail(self,response):
- #//*[@id="post-110769"]/div[1]/h1
- #re_selector = response.xpath('//*[@id="post-110769"]/div[1]/h1/text()')
- #re2_selector = response.xpath('/html/body/div[3]/div[1]/h1/text()')
- #re3_selector = response.xpath('//div[@class="entry-header"]/h1/text()')
- #xpath()中的 text()函数是去除html,查看d标签外的 data的内容
- title = response.xpath('/html//div[@class="entry-header"]/h1/text()')
- #xpath()中的extracr()函数作用:将xpath()函数产生的Selector xpath对象的内容,并且以列表的对象返回;其他事去除空格和点号不必要的字符
- add_time=response.xpath('/html//p[@class="entry-meta-hide-on-mobile"]/text()').extract()[0].strip().replace("·","")
- #文章点赞人数,contains() 是xpath()的内置函数用法,找出在span中class属性包含'vote-post-up'字符串的标签
- like = response.xpath('//span[contains(@class,"vote-post-up")]/h10/text()').extract()[0]
- #文章收藏人数:fav_num xpath解析 10收藏 re再解析 为:10
- fav_temp = response.xpath('//span[contains(@class,"bookmark-btn")]/text()').extract()[0]
- re_fav_num = re.match(".*(\d+).*",fav_temp)
- if re_fav_num:
- fav_num = int(re_fav_num.group(1))
- else:
- fav_num = 0
- #文章评论人数:解析同收藏人数
- comment_temp = response.xpath('//span[@class="btn-bluet-bigger href-style hide-on-480"]/text()').extract()[0]
- re_comment = re.match(".*(\d+).*",comment_temp)
- if re_comment:
- comment_num = int(re_comment.group(1))
- else:
- comment_num = 0
- #文章内容,简单提取,不太复杂的,不深入研究
- content = response.xpath('//div[@class="entry"]').extract()[0]
- #标签:涉及去重评论
- temp_tag = response.xpath('/html//p[@class="entry-meta-hide-on-mobile"]/a/text()')
- tag_list = [x for x in tag if not x.strip().endswith("评论") ]
- tags = ";".join(tag_list)
- pass
- '''
- #通过css选择器提取数据
- #提取标题 .后面跟的代表的是class的属性
- css_title = response.css(".entry-header h1::text").extract()[0]
- #添加时间 提取p标签的class的唯一值为entry-meta-hide-on-mobile属性的标签,::text是提取其内容,与text()相似
- css_add_time =response.css("p.entry-meta-hide-on-mobile::text").extract()[0].strip().replace("·","")
- #点赞人数:class 属性为vote-post-up 的唯一的标签
- css_like = response.css(".vote-post-up h10::text").extract()[0]
- #文章收藏人数,对于数组来说按索引提取有风险,所有需要异常捕获操作,extract_first()就是对其进行异常操作,保证列表为空时不报错
- css_fav_temp = response.css(".bookmark-btn::text").extract_first()
- re_fav_num = re.match(".*(\d+).*",fav_temp)
- if re_fav_num:
- css_fav_num = re_fav_num.group(1)
- #文章评论人数
- re_comment = response.css('a[href="#article-comment"] span::text').extract_first()("0")
- if re_comment:
- comment_num = re_comment.group(1)
- #标签:涉及去重评论
- temp_tag = response.css('p[class="entry-meta-hide-on-mobile"] a::text').extract()
- tag_list = [x for x in tag if not x.strip().endswith("评论") ]
- tags = ";".join(tag_list)
- '''
Scrapy基础(六)————Scrapy爬取伯乐在线一通过css和xpath解析文章字段的更多相关文章
- 爬虫实战——Scrapy爬取伯乐在线所有文章
Scrapy简单介绍及爬取伯乐在线所有文章 一.简说安装相关环境及依赖包 1.安装Python(2或3都行,我这里用的是3) 2.虚拟环境搭建: 依赖包:virtualenv,virtualenvwr ...
- python爬虫scrapy框架——爬取伯乐在线网站文章
一.前言 1. scrapy依赖包: 二.创建工程 1. 创建scrapy工程: scrapy staratproject ArticleSpider 2. 开始(创建)新的爬虫: cd Artic ...
- Scrapy爬取伯乐在线的所有文章
本篇文章将从搭建虚拟环境开始,爬取伯乐在线上的所有文章的数据. 搭建虚拟环境之前需要配置环境变量,该环境变量的变量值为虚拟环境的存放目录 1. 配置环境变量 2.创建虚拟环境 用mkvirtualen ...
- 第三天,爬取伯乐在线文章代码,编写items.py,保存数据到本地json文件中
一. 爬取http://blog.jobbole.com/all-posts/中的所有文章 1. 编写jobbole.py简单代码 import scrapy from scrapy. ...
- Scrapy爬取伯乐在线文章
首先搭建虚拟环境,创建工程 scrapy startproject ArticleSpider cd ArticleSpider scrapy genspider jobbole blog.jobbo ...
- 爬取伯乐在线文章(五)itemloader
ItemLoader 在我们执行scrapy爬取字段中,会有大量的CSS或是Xpath代码,当要爬取的网站多了,要维护起来很麻烦,为解决这类问题,我们可以根据scrapy提供的loader机制. 导入 ...
- 爬取伯乐在线文章(四)将爬取结果保存到MySQL
Item Pipeline 当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item. 每个Item Pipeline ...
- 爬取伯乐在线文章(二)通过xpath提取源文件中需要的内容
爬取说明 以单个页面为例,如:http://blog.jobbole.com/110287/ 我们可以提取标题.日期.多少个评论.正文内容等 Xpath介绍 1. xpath简介 (1) xpath使 ...
- scrapy爬取伯乐在线文章数据
创建项目 切换到ArticleSpider目录下创建爬虫文件 设置settings.py爬虫协议为False 编写启动爬虫文件main.py
随机推荐
- 10进制 VS 2进制
10进制 VS 2进制 时间限制: 1 Sec 内存限制: 32 MB 题目描述 样例输出 623 #include<stdio.h> #include<string.h> ...
- Appium Python API 中文版
Appium_Python_Api文档 1.contextscontexts(self): Returns the contexts within the current session. 返回当前会 ...
- 利用sqoop对mysql执行DML操作
业务背景 利用Sqoop对MySQL进行查询.添加.删除等操作. 业务实现 select操作: sqoop eval \ --connect jdbc:mysql://127.0.0.1:3306/m ...
- 从零开始学C#——不再更新,直接进入高阶教程
从零开始学习C#不再更新,直接进入高阶教程. 入门教程,请自行谷歌.百度吧,有很多这样的教程. 编程是一件实践性很强的事情,那么接下来的文章将开始进行开发项目. 还在编程中迷茫的人们,先暂时放下一切的 ...
- How to trigger an Animation when TextBlock’s Text is changed during a DataBinding
原文:http://michaelscherf.wordpress.com/2009/02/23/how-to-trigger-an-animation-when-textblocks-text-is ...
- 计算1至n中数字X出现的次数【math】
转自: nailperry 一.1的数目 编程之美上给出的规律: 1. 如果第i位(自右至左,从1开始标号)上的数字为0,则第i位可能出现1的次数由更高位决定(若没有高位,视高位为0),等于更高位数字 ...
- Java实现Redis消息队列
这里我使用Redis的发布.订阅功能实现简单的消息队列,基本的命令有publish.subscribe等. 在Jedis中,有对应的java方法,但是只能发布字符串消息.为了传输对象,需要将对象进行序 ...
- BeautifulSoup下Unicode乱码解决
今天在用scrapy爬某个网站的数据,其中DOM解析我用的是BeautifulSoup,速度上没有XPath来得快,不过因为用了习惯了,所以一直用的bs,版本是bs4 不过在爬取过程中遇到了一些问题, ...
- HTTP虚拟主机
Ps:http-2.4版本 [root@localhost ~]# tar zxvf httpd-2.4.23.tar.gz -C /usr/src/ [root@localhost ~]# cd / ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-8项目加密解密方案
本文目录1. 摘要2. MD5加密封装3. AES的加密.解密4. DES加密/解密5. 总结 1. 摘要 C#中常用的一些加密和解密方案,如:md5加密.RSA加密与解密和DES加密等,Asp.N ...