四、Scrapy爬取伯乐在线并通过css解析文章字段

一、总体思路:

1、下载start_urls,交给parse方法处理,文章列表页start_urls = ['http://blog.jobbole.com/all-posts/']

2、parse处理,从中获取本页的文章url(以后获取到文章首图传递个自定义的parse_detail),和下一页的url

3、将下一页的url交给parse方法。继续进行1和2;将文章url传递给自定义的解析函数parse_detail

4、parse方法对下一页的url进行下载,自定义的parse_detial则通过css或者xpath 解析有用的信息传递给Item,次数两个操作是异步操作

二、进行两步操作:

1、从页面抓取所有的文章url交给解析器进行解析这个页面的标题时间点赞数等

2、从页面抓取下一个页面的url 进行下载

以上两部是异步进行的,什么叫异步。就是小明一边在吃冰棍,一边在看电视,懂了吗?


提取具体文章的href

>>> response.css("#archive .floated-thumb .post-thumb a::attr(href)").extract() ['http://blog.jobbole.com/111366/', 'http://blog.jobbole.com/111363/', 'http://blog.jobbole.com/111360/', 'http://blog.jobbole.com/111318/', 'http://blog.jobbole.com/108614/', 'http://blog.jobbole.com/111231/', 'http://blog.jobbole.com/111334/', 'http://blog.jobbole.com/111317/', 'http://blog.jobbole.com/111322/', 'http://blog.jobbole.com/111293/', 'http://blog.jobbole.com/111319/', 'http://blog.jobbole.com/111312/', 'http://blog.jobbole.com/102337/', 'http://blog.jobbole.com/111291/', 'http://blog.jobbole.com/111189/', 'http://blog.jobbole.com/111269/', 'http://blog.jobbole.com/111268/', 'http://blog.jobbole.com/111276/', 'http://blog.jobbole.com/111261/', 'http://blog.jobbole.com/111249/']

这样顺利的把列表页的href都提取出来啦!

tips:别忘了,在导入库上面要加入:from scrapy.http import Request# 从scrap上让Request工具帮忙进行下载

#从网页提取文章的URL,交给scrapy下载,并传递给parse_detail解析

#不是完整的地址,urljoin有两个参数,主域名自动拼接不完整的域名,并from urllib import parseyield 拼拼接过程:Request ( url=parse.urljoin ( response.url, post_url ), callback=self.parse_detail )

注意!!!拼接!别小看这个,很重要。好多网站都需要拼接,虽然jobbole用不到,以后用到的地方很多!!

提取下一页:

>>> response.css(".next.page-numbers ::attr(href)").extract()[0]

'http://blog.jobbole.com/all-posts/page/2/

注意,这个里面有两个标签,一个next和page-numbers,把两个合并起来,中间不要有空格,这个提取比较特殊。

三、写完了这也代码,有必要debug一下了。

# -*- coding: utf-8 -*-

importscrapy

importre

fromscrapy.httpimportRequest# 从scrap上让Request工具帮忙进行下载

fromurllibimportparse# 利用parse函数把url给join起来

classJobboleSpider(scrapy.Spider):

name ='jobbole'

allowed_domains = ['blog.jobbole.com']

start_urls = ['http://blog.jobbole.com/all-posts/']

defparse(self,response):

post_urls = response.css ('#archive .floated-thumb .post-thumb a ::attr(href)').extract ()# 从网页提取文章的URL,交给scrapy下载,并传递给parse_detail解析

forpost_urlinpost_urls:

yieldRequest (url=parse.urljoin ( response.url, post_url ),callback=self.parse_detail )

# callback回调进入datail周期进行循环

# yield是通过scrapy的Request()下载,并且交给自定义的parse_detail解析

#不是完整的地址,urljoin有两个参数,主域名自动拼接不完整的域名,并from urllib import parse

# 提取下一页并交给scrapy进行下载

next_url = response.css (".next.page-numbers::attr(href)").extract_first ("")

ifnext_url:

yieldRequest (url=parse.urljoin ( response.url, next_url ),callback=self.parse )

defparse_detail(self, response):

title= response.css (".entry-header h1::text").extract ()[0]

create_date=response.css("p.entry-meta-hide-on-mobile::text").extract()[0].strip()

praise_nums=response.css(".vote-post-up h10::text").extract()[0]

fav_nums=response.css(".bookmark-btn::text").extract()[0]

match_re = re.match (".*?(\d+).*", fav_nums )

ifmatch_re:

fav_nums=int(match_re.group (1))

else:

fav_nums=0

comment_nums=response.css("a[href='#article-comment'] span::text").extract()[0]

match_re = re.match(".*?(\d+).*", comment_nums)

ifmatch_re:

comment_nums=int(match_re.group (1))

else:

comment_nums=0

content=response.css ("div.entry").extract ()[0]

tag_list=response.css("p.entry-meta-hide-on-mobile a::text").extract()

tag_list = [elementforelementintag_listif notelement.strip ().endswith ("评论")]

tags=",".join ( tag_list )

pass


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从现在开始 我有33个小时可以浪费 请叫我最富有的人
    天野丢阅读 192评论 2 0
  • 夜刻深荡 风还是那样四处流浪 可冷,可急,可伤 半边银径 走的还是那么悠扬 且慢,且雅,且境 孤处尘埃 悄然飘洒瑟...
    生于1937的年轻人阅读 154评论 0 0