上次我们介绍了scrapy的安装和加入debug的main文件,这次重要介绍创建的爬虫的基本爬取有用信息

通过命令(这篇博文)创建了jobbole这个爬虫,并且生成了jobbole.py这个文件,又写了xpathcss的基本用法的博文

首先分析网页的结构和抓取流程:

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解析文章字段的更多相关文章

  1. 爬虫实战——Scrapy爬取伯乐在线所有文章

    Scrapy简单介绍及爬取伯乐在线所有文章 一.简说安装相关环境及依赖包 1.安装Python(2或3都行,我这里用的是3) 2.虚拟环境搭建: 依赖包:virtualenv,virtualenvwr ...

  2. python爬虫scrapy框架——爬取伯乐在线网站文章

    一.前言  1. scrapy依赖包: 二.创建工程 1. 创建scrapy工程: scrapy staratproject ArticleSpider 2. 开始(创建)新的爬虫: cd Artic ...

  3. Scrapy爬取伯乐在线的所有文章

    本篇文章将从搭建虚拟环境开始,爬取伯乐在线上的所有文章的数据. 搭建虚拟环境之前需要配置环境变量,该环境变量的变量值为虚拟环境的存放目录 1. 配置环境变量 2.创建虚拟环境 用mkvirtualen ...

  4. 第三天,爬取伯乐在线文章代码,编写items.py,保存数据到本地json文件中

        一. 爬取http://blog.jobbole.com/all-posts/中的所有文章     1. 编写jobbole.py简单代码 import scrapy from scrapy. ...

  5. Scrapy爬取伯乐在线文章

    首先搭建虚拟环境,创建工程 scrapy startproject ArticleSpider cd ArticleSpider scrapy genspider jobbole blog.jobbo ...

  6. 爬取伯乐在线文章(五)itemloader

    ItemLoader 在我们执行scrapy爬取字段中,会有大量的CSS或是Xpath代码,当要爬取的网站多了,要维护起来很麻烦,为解决这类问题,我们可以根据scrapy提供的loader机制. 导入 ...

  7. 爬取伯乐在线文章(四)将爬取结果保存到MySQL

    Item Pipeline 当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item. 每个Item Pipeline ...

  8. 爬取伯乐在线文章(二)通过xpath提取源文件中需要的内容

    爬取说明 以单个页面为例,如:http://blog.jobbole.com/110287/ 我们可以提取标题.日期.多少个评论.正文内容等 Xpath介绍 1. xpath简介 (1) xpath使 ...

  9. scrapy爬取伯乐在线文章数据

    创建项目 切换到ArticleSpider目录下创建爬虫文件 设置settings.py爬虫协议为False 编写启动爬虫文件main.py

随机推荐

  1. python之路第二天

    为何要有操作系统 为了让程序员更轻松的完成命令电脑工作而存在的,控制硬件,服务于软件. 操作系统的位置 操作系统位于软件和硬件之间.操作系统由内核(运行于内核态,控制硬件)和系统调用(运行于用户态,为 ...

  2. Vue中使用Vue.component定义两个全局组件,用单标签应用组件时,只显示一个组件的问题和 $emit的使用。

    解决方法: 定义了两个 Vue.component 在 el 中使用的时候要用 双标签, 用单表标签的时候,只会显示第个 组件间 这样写只显示 welcome-button 组件 <welcom ...

  3. XMind思维导图使用笔记

    首先新建一个空白的图 以组织结构图(向下)  为例 1.双击组织结构图 创建一个空白的页面 2.随便选择一个风格 这时候出现工作台 现在里面只有一个中心主题 正文部分开始 1.如果想要添加一个子主题 ...

  4. new/new[]和delete/delete[]是如何分配空间以及释放空间的

    C++中程序存储空间除栈空间和静态区外,每个程序还拥有一个内存池,这部分内存被称为或堆(heap).程序可以用堆来存储动态分配的对象,即那些在程序运行时创建的对象.动态对象的生存期由程序来控制 ,当动 ...

  5. HTTP 599: SSL certificate problem: unable to get local issuer certificate错误

    自己在用 PySpider 框架爬虫运行代码后时出现 HTTP 599: SSL certificate problem: unable to get local issuer certificate ...

  6. Nancy 自寄宿

    一:简介 Self Hosting 顾名思义,就是自己Host自己.也就是不需要依赖别的应用,而让应用本身就是服务.一个Console程序或者一个Winform程序都是一个应用,Self Hostin ...

  7. [转] css3变形属性transform

    w3c上的例子是这样子写的:· div { transform:rotate(7deg); -ms-transform:rotate(7deg); /* IE 9 */ -moz-transform: ...

  8. bzoj2683&&bzoj4066

    题解: 前一题不是强制在线,后一题是强制在线 树套树空间会炸 说一下cdq分治+树状数组 首先我们利用cdq分治使得查询和操作保证先后关系 然后矩阵查询变成4个矩阵的差 那么我们就可以运用扫描线的方法 ...

  9. Busybox制作ARM(iTOP4412) 根文件系统

    本记录来源与自身操作过程. 1.制作环境 PC环境:外部Winows8.1 内部则为vmware11+ubuntu12.04 嵌入式设备:iTOP4412 交叉工具:arm-none-linux-gn ...

  10. Windows下80端口被进程System占用的解决方法

    最近电脑时不时就发生了80端口被占用的情况,简单百度解决后,当重启电脑的时候又发生被占用的情况.今天非常幸运的是,发生了80端口和8080端口都被占用了情况,忍无可忍决定下定决心解决这个坑爹的问题,经 ...