我是靠谱客的博主 称心大地,最近开发中收集的这篇文章主要介绍爬虫 scrapy+beautifulsoup的一些小知识点暂停scrapy爬虫执行--?处理爬取页面状态码不是200的情况,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

scrapy中的response的编码:response.encoding。

如果出现编码问题,可以使用以下语句:

def news_parse_3(self, response):
    soup = BeautifulSoup(response.body.decode(encoding=response.encoding, errors='ignore'), 'html.parser')

如果想在请求之间传递参数的话,可以使用meta属性

yield scrapy.Request(url, callback=self.func, meta={})

使用;

rsponse.meta['xx']

使用命令运行爬虫时,可以使用-a选项来添加参数,然后在在相应的类中使用(变成了类属性,使用self.xxx访问),一个-a只能跟一个参数。传进去的都是字符串。

scrapy crawl myspider -a category=electronics
getattr(self, 'tag', None)
或
self.tag  # 这个可能会抛出异常


 

 

class scrapy.spiders.Rule(link_extractor,callback = None,cb_kwargs = None,follow = None,process_links = None,process_request = None )

cb_kwargs 是一个包含要传递给回调函数的关键字参数的dict。

 

图片管道:

ITEM_PIPELINES = {'scrapy.pipelines.images.ImagesPipeline': 1}
IMAGES_STORE = '/path/to/valid/dir'

 

文件管道:

ITEM_PIPELINES = {'scrapy.pipelines.files.FilesPipeline': 1}
FILES_STORE = '/path/to/valid/dir'

在代码在获取settings中的变量:

pipelines.py

self.settings['xxx']

 

class SomethingPipeline(object):
    def __init__(self):    
        # 可选实现,做参数初始化等

    def process_item(self, item, spider):
        return item

    def open_spider(self, spider):
        # 可选实现,当spider被开启时,这个方法被调用。

    def close_spider(self, spider):
        # 可选实现,当spider被关闭时,这个方法被调用

 

 

暂停scrapy爬虫执行

通过增加参数JOBDIR来进行,有2中加参数的方法。

1. 直接在启用爬虫时,即在命令行中加入参数:

scrapy crawl pachong -s JOBDIR=xxx/001

上述命令会启动爬虫,当我们在按ctrl+c(只按一次)停止爬虫,停止后就会在目录xxx/001下生成相关文件,用来保存相关信息。

下次我们想接着上次爬,就可以用如下命令启动爬虫,代表我们使用xxx/001文件夹下的状态信息:

scrapy crawl onespider -s JOBDIR=xxx/001

该命令运行后按下一次ctrl+c后scrapy接收到一次暂停的信号注意这里只能按一次ctrl+c如果按了两次就表示强制退出了。

注:生成的xxx/001目录在项目的根目录下(即与scrapy.cfg文件在同一目录)。

 

2. 直接在设置文件settings.py里加入下面的代码: 

JOBDIR='xxx/001'

使用命令scrapy crawl onespider,就会自动生成一个xxx/001的目录,然后将工作列表放到这个文件夹里。
 

注:当第二次输入启动命令启动时爬虫可能会覆盖掉原来的数据,因为你打开文件不是使用的append模式。

 

 

--

 

 

 

docker pull scrapinghub/splash
docker run -p 8050:8050 -p 5023:5023 scrapinghub/splash

docker run -p 8050:8050 scrapinghub/splash

 

scrapy的css选择器

*
所有节点

#xxx
选择id为xxx的节点

.xxx
选择class为xxx的节点

li a
选择所有li下的所有a节点(即li下的所有子孙节点a)

li,a
选择所有li和a节点

ul + p
选择ul后的第一个p节点(ul的兄弟节点p)

div#xxx > ul
选择id为xxx的div的第一个ul子节点

ul ~ p
选取与ul相邻的所有的p元素

a[title]
选取所有包含有title属性的a元素

a[href="http://jobbole.com"]
选取所有href属性为jobbole.com的a元素

a[href*="jobbole"]
选取所有href属性包含jobbole的a元素

a[href^="http"]
选取所有href属性以http开头的a元素

a[href$=".jpg"]
选取所有href属性以.jpg结尾的a元素

div:not(#xxx)
选取所有id不为xxx的div元素

li:nth-child(3)
选取第三个li元素

p:nth-last-child(2)
反选第2个p标签

tr:nth-child(2n)
第偶数个tr

p:last-child
选择每个p元素是其父级的最后一个子级。

xxx::text
选取xxx标签的文本内容

xxx:attr[yyy]
选取xxx标签的yyy属性

 

scrapy的xpath选择器

@xxx
选取含有属性xxx的节点

//
选取所有节点

a/@href
选择a标签下的href属性

a/text()
选择a标签下的文本


/artical/div[1]
选取所有属于artical 子元素的第一个div元素

/artical/div[last()]

/artical/div[position()<3]	
选取所有属于artical子元素的前2个div元素

//div[@class]
选取所有拥有属性class的div节点

//div[@class=”main”]
选取所有div下class属性为main的div节点

//div[starts-with(@id,”ma”)]
选取id值以ma开头的div节点


//div[contains(@id,”ma”)]


//div[contains(@id,”ma”) and contains(@id,”in”)]

//div[contains(text(),”ma”)]
选取节点文本包含ma的div节点




 

对css或xpath的选取起辅助作用:检查网页源代码,然后在相应的标签出右键单击。

 

此外,还可以在console中使用表达式 $x('xpath表达式') 来获取相应节点:

使用$获取css表达式(Copy selector),使用$x获取xpath表达式(Copy xpath)。

 

?处理爬取页面状态码不是200的情况

1. 记录错误页面信息,可以继承类 HttpErrorMiddleware, 实现其中的process_spider_input方法,将状态码为404的response的url写到某个文件中。

2. 为了减少IO操作,可以用一个变量记录下所有的404 url,然后将crawler绑定spider_closed信号,这样就能在爬虫关闭的时候将记录下的url一并写入。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

最后

以上就是称心大地为你收集整理的爬虫 scrapy+beautifulsoup的一些小知识点暂停scrapy爬虫执行--?处理爬取页面状态码不是200的情况的全部内容,希望文章能够帮你解决爬虫 scrapy+beautifulsoup的一些小知识点暂停scrapy爬虫执行--?处理爬取页面状态码不是200的情况所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(30)

评论列表共有 0 条评论

立即
投稿
返回
顶部