irpas技术客

爬取人民日报_scrapy爬虫爬取新闻入坑第一课_严强强

大大的周 7311

话不多说先上代码:爬取人民日报

下面一步一步的介绍整个scrapy的架构

首先我们要先下载scrapy框架,这里解释一下框架和库的区别:框架是一种有别于软件,但是面向开发者的一种工具,是一种产品的形式,而库则只是一种代码的集合。

下载scrapy:

pip install scrapy

这里使用的python版本是Python3.5,有些同学在装scrapy的时候可能会报miss c++ 14.0的错误,这里解决方法就是缺少Twisted这个依赖,这里需要自己去这里下载并安装这个依赖

安装好以后我们就进入正题。

首先,我们要新建一个目录:

scrapy startproject myspider

然后进入这个目录并新建一个爬虫文件:

scrapy genspider -t spidername domain.com#这里的domain是你要爬取的网页域名可加可不加

下面我们可以看下文件目录

其中item.py定义了你需要爬取的数据类型,spiders目录里面是你的爬虫,setting中是一些配置信息,pipelines.py中是爬取到的item的存储方式。

下面让我们先看一下spiders目录中我们最关心爬虫部分:

话不多说上代码:

from scrapy.spiders import Spider

from scrapy.selector import Selector

from scrapy.http import Request, FormRequest

from dirbot.items import Website

import scrapy

import re

class DmozSpider(Spider):

name = "dmoz"

# allowed_domains = ["dmoz.org"]

# start_urls = [

# "http://baozouribao.com/documents",

# ]

def start_requests(self):

for i in range(1,11):#这个地方是月份,

for k in range(1,32):#这个地方是日期

if i<10:

url1="http://paper.people.com.cn/rmrb/html/2017-0"+str(i)

else :

url1="http://paper.people.com.cn/rmrb/html/2017-"+str(i)

if k<10:

url=url1+"/0"+str(k)+"/nbs.D110000renmrb_01.htm"

else :

url=url1+"/"+str(k)+"/nbs.D110000renmrb_01.htm"

yield(Request(url,headers=None,callback=self.parse))

def parse(self,response):

site=response.xpath("//map[@name='PagePicMap']/area")

url=response.url

url=re.match('(http://paper.people.com.cn/rmrb/html/201[0-9]-[0-9][0-9]/[0-9][0-9]/)',url)

url=(url.group(1))

for i in site:

ready_url=url+(i.xpath("@href").extract()[0])

yield (Request(ready_url,callback=self.my_parse))

next_pages=response.xpath("//div[@class='ban_t']/div[1]/ul[1]/li[1]/span[1]/a")

for i in next_pages:

next_page=i.xpath('text()').extract()[0]

if (next_page=="下一版 "):

next_page=i.xpath("@href").extract()[0]

break

if len(next_page)==0:

pass

else :

next_page=url+next_page

yield Request(next_page,callback=self.parse)

def my_parse(self,response):

item=Website()

title=response.xpath("//div[@class='text_c']/h1/text()").extract()[0]

item['title']=title

contents=""

content=response.xpath("//div[@id='ozoom']/p")

for i in content:

#print(i)

contents+=i.xpath("text()").extract()[0]

item['content']=contents

yield item

我们不讲那些理论,直接从代码入手

首先,我们要定义爬取的网页入口,用start_urls存取,这是一个list文件,这里面的网址都会,被默认的start_request()这个函数所接受然后返回一个可迭代的resquest对象,并将读取到的html代码以response参数返回默认的回调函数parse().上面说的这些都是默认的情况,说道默认我们就会知道默认就可以改。

其实这里我就做了修改,可以看到我的start_urls已经被注释了起来,因为我不想用默认,我只想自己写start_request()函数,这个里面我们就可以定义我们要爬取的url目录,因为有些url是有一定的规律的,并不用爬取得到url,用一些简单的逻辑就能得到想要的url列表。

可以看到这里我们调用了Request()函数,这个函数会以默认get的方式去访问第一个参数也就是我们定义的url,并返回一个response,另外如果我们不指定回调函数或者callback=None,那么我们的回调函数会是默认的parse()函数,但是如果我们指定非默认的回调函数,那么程序就会自动去找我们自定义的函数。

这个地方有人会问yield这个关键字是干什么的,这里我解释一下:

因为我们有时候也不知道网页到底有多少,如果一下子全拿出来,放到列表中有可能会撑破我们的内存, yield关键字就是把我们的这个函数变成了一个生成器,也就是一个可迭代对象,我们就可以想列表一样去取里面的值,而且是取到一个才会去取下一个,内存的消耗是非常小的。

parse()函数返回的对象中,有一个可迭代的response对象,这也是一个选择器对象,我们可以对其使用

xpath方法,这个方法可以让我们很方便的取得我们想要的数据,并通过item存储,最后通过管道保存到数据库或者本地文件。

这篇文章就先探讨一个spider的构成,之后再讲一下其他的模块。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #python爬取人民日报 #下载scrapypip #install #C #140的错误这