Python的Scrapy爬虫框架简单学习笔记
作者:明天以后 发布时间:2023-09-25 06:41:44
一、简单配置,获取单个网页上的内容。
(1)创建scrapy项目
scrapy startproject getblog
(2)编辑 items.py
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html
from scrapy.item import Item, Field
class BlogItem(Item):
title = Field()
desc = Field()
(3)在 spiders 文件夹下,创建 blog_spider.py
需要熟悉下xpath选择,感觉跟JQuery选择器差不多,但是不如JQuery选择器用着舒服( w3school教程: http://www.w3school.com.cn/xpath/ )。
# coding=utf-8
from scrapy.spider import Spider
from getblog.items import BlogItem
from scrapy.selector import Selector
class BlogSpider(Spider):
# 标识名称
name = 'blog'
# 起始地址
start_urls = ['http://www.cnblogs.com/']
def parse(self, response):
sel = Selector(response) # Xptah 选择器
# 选择所有含有class属性,值为‘post_item'的div 标签内容
# 下面的 第2个div 的 所有内容
sites = sel.xpath('//div[@class="post_item"]/div[2]')
items = []
for site in sites:
item = BlogItem()
# 选取h3标签下,a标签下,的文字内容 ‘text()'
item['title'] = site.xpath('h3/a/text()').extract()
# 同上,p标签下的 文字内容 ‘text()'
item['desc'] = site.xpath('p[@class="post_item_summary"]/text()').extract()
items.append(item)
return items
(4)运行,
scrapy crawl blog # 即可
(5)输出文件。
在 settings.py 中进行输出配置。
# 输出文件位置
FEED_URI = 'blog.xml'
# 输出文件格式 可以为 json,xml,csv
FEED_FORMAT = 'xml'
输出位置为项目根文件夹下。
二、基本的 -- scrapy.spider.Spider
(1)使用交互shell
dizzy@dizzy-pc:~$ scrapy shell "http://www.baidu.com/"
2014-08-21 04:09:11+0800 [scrapy] INFO: Scrapy 0.24.4 started (bot: scrapybot)
2014-08-21 04:09:11+0800 [scrapy] INFO: Optional features available: ssl, http11, django
2014-08-21 04:09:11+0800 [scrapy] INFO: Overridden settings: {'LOGSTATS_INTERVAL': 0}
2014-08-21 04:09:11+0800 [scrapy] INFO: Enabled extensions: TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState
2014-08-21 04:09:11+0800 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats
2014-08-21 04:09:11+0800 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
2014-08-21 04:09:11+0800 [scrapy] INFO: Enabled item pipelines:
2014-08-21 04:09:11+0800 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6024
2014-08-21 04:09:11+0800 [scrapy] DEBUG: Web service listening on 127.0.0.1:6081
2014-08-21 04:09:11+0800 [default] INFO: Spider opened
2014-08-21 04:09:12+0800 [default] DEBUG: Crawled (200) <GET http://www.baidu.com/> (referer: None)
[s] Available Scrapy objects:
[s] crawler <scrapy.crawler.Crawler object at 0xa483cec>
[s] item {}
[s] request <GET http://www.baidu.com/>
[s] response <200 http://www.baidu.com/>
[s] settings <scrapy.settings.Settings object at 0xa0de78c>
[s] spider <Spider 'default' at 0xa78086c>
[s] Useful shortcuts:
[s] shelp() Shell help (print this help)
[s] fetch(req_or_url) Fetch request (or URL) and update local objects
[s] view(response) View response in a browser
>>>
# response.body 返回的所有内容
# response.xpath('//ul/li') 可以测试所有的xpath内容
More important, if you type response.selector you will access a selector object you can use to
query the response, and convenient shortcuts like response.xpath() and response.css() mapping to
response.selector.xpath() and response.selector.css()
也就是可以很方便的,以交互的形式来查看xpath选择是否正确。之前是用FireFox的F12来选择的,但是并不能保证每次都能正确的选择出内容。
也可使用:
scrapy shell 'http://scrapy.org' --nolog
# 参数 --nolog 没有日志
(2)示例
from scrapy import Spider
from scrapy_test.items import DmozItem
class DmozSpider(Spider):
name = 'dmoz'
allowed_domains = ['dmoz.org']
start_urls = ['http://www.dmoz.org/Computers/Programming/Languages/Python/Books/',
'http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/,'
'']
def parse(self, response):
for sel in response.xpath('//ul/li'):
item = DmozItem()
item['title'] = sel.xpath('a/text()').extract()
item['link'] = sel.xpath('a/@href').extract()
item['desc'] = sel.xpath('text()').extract()
yield item
(3)保存文件
可以使用,保存文件。格式可以 json,xml,csv
scrapy crawl -o 'a.json' -t 'json'
(4)使用模板创建spider
scrapy genspider baidu baidu.com
# -*- coding: utf-8 -*-
import scrapy
class BaiduSpider(scrapy.Spider):
name = "baidu"
allowed_domains = ["baidu.com"]
start_urls = (
'http://www.baidu.com/',
)
def parse(self, response):
pass
这段先这样吧,记得之前5个的,现在只能想起4个来了. :-(
千万记得随手点下保存按钮。否则很是影响心情的(⊙o⊙)!
三、高级 -- scrapy.contrib.spiders.CrawlSpider
例子
#coding=utf-8
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor
import scrapy
class TestSpider(CrawlSpider):
name = 'test'
allowed_domains = ['example.com']
start_urls = ['http://www.example.com/']
rules = (
# 元组
Rule(LinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))),
Rule(LinkExtractor(allow=('item\.php', )), callback='pars_item'),
)
def parse_item(self, response):
self.log('item page : %s' % response.url)
item = scrapy.Item()
item['id'] = response.xpath('//td[@id="item_id"]/text()').re('ID:(\d+)')
item['name'] = response.xpath('//td[@id="item_name"]/text()').extract()
item['description'] = response.xpath('//td[@id="item_description"]/text()').extract()
return item
其他的还有 XMLFeedSpider
class scrapy.contrib.spiders.XMLFeedSpider
class scrapy.contrib.spiders.CSVFeedSpider
class scrapy.contrib.spiders.SitemapSpider
四、选择器
>>> from scrapy.selector import Selector
>>> from scrapy.http import HtmlResponse
可以灵活的使用 .css() 和 .xpath() 来快速的选取目标数据
关于选择器,需要好好研究一下。xpath() 和 css() ,还要继续熟悉 正则.
当通过class来进行选择的时候,尽量使用 css() 来选择,然后再用 xpath() 来选择元素的熟悉
五、Item Pipeline
Typical use for item pipelines are:
• cleansing HTML data # 清除HTML数据
• validating scraped data (checking that the items contain certain fields) # 验证数据
• checking for duplicates (and dropping them) # 检查重复
• storing the scraped item in a database # 存入数据库
(1)验证数据
from scrapy.exceptions import DropItem
class PricePipeline(object):
vat_factor = 1.5
def process_item(self, item, spider):
if item['price']:
if item['price_excludes_vat']:
item['price'] *= self.vat_factor
else:
raise DropItem('Missing price in %s' % item)
(2)写Json文件
import json
class JsonWriterPipeline(object):
def __init__(self):
self.file = open('json.jl', 'wb')
def process_item(self, item, spider):
line = json.dumps(dict(item)) + '\n'
self.file.write(line)
return item
(3)检查重复
from scrapy.exceptions import DropItem
class Duplicates(object):
def __init__(self):
self.ids_seen = set()
def process_item(self, item, spider):
if item['id'] in self.ids_seen:
raise DropItem('Duplicate item found : %s' % item)
else:
self.ids_seen.add(item['id'])
return item
至于将数据写入数据库,应该也很简单。在 process_item 函数中,将 item 存入进去即可了。


猜你喜欢
- 介绍我编写了一个快速且带有斑点的python脚本,以可视化nmap和masscan的结果。它通过解析来自扫描的XML日志并生成所扫描IP范围
- 目录一、代码分析二、完整代码写在最后想必写毕设的时候,大家都会遇到一个问题,那就是得在明评版的论文里面插入一个独创性声明。就因为这个事情,我
- I. Strict Mode阐述根据 mysql5.0以上版本 strict mode (STRICT_TRANS_TABLES) 的限制:
- 如下所示:from bs4 import BeautifulSouppath = './web/new_index.html'
- MySQL 的 SQL 語法調整主要都是使用 EXPLAIN , 但是這個並沒辦法知道詳細的 Ram(Memory)/CPU 等使用量.於
- Conda GuideConda简介conda是一个包,依赖和环境管理工具,适用于多种语言,如: Python, R, Scala, Jav
- 概述在pytorch中有两种方式可以保存推理模型,第一种是只保存模型的参数,比如parameters和buffers;另外一种是保存整个模型
- 1. 建表的语法建表属于 DDL 语句,DDL 语句包括:create、drop、alter…create table
- 系列教程MySQL系列之开篇 MySQL关系型数据库基础概念 MySQL系列之一 MariaDB-server安装 MySQL系列之二 多实
- Python3中sort方法是列表类型list的内置方法,使用sort方法对list排序会修改list本身,不会返回新的list。sort方
- 本文实例讲述了php实现的微信分享到朋友圈并记录分享次数功能。分享给大家供大家参考,具体如下:1.引入JS文件2.通过config接口注入权
- 前言我们今天来介绍一个js案例,本文仅供学习参考,大家谨慎使用。 我们先认识一下,什么是js逆向。JavaScript 逆向是指对 Java
- 问题描述vscode中跨目录的模块调用远不如pycharm中的来的简单,在pycharm中即使是不同库文件夹中子函数也可以进行互相调用。而在
- 介绍asyncore库是python的一个标准库,提供了以异步的方式写入套接字服务的客户端和服务器的基础结构。操作网络的时候可以直接使用so
- 1、异常出现的场景.:在使用Hibernate做为项目持久层的情况下,需要对某一张表进行一个扩展,扩展操作便是在该表上创建一个触发器。将表中
- golang常用库:gorilla/mux-http路由库使用golang常用库:配置文件解析库-viper使用golang常用库:操作数据
- Accessibility—-可访问性/无障碍访问Accessibility在此处指网页的可访问性。W3C的网页可访问性定义如下:“网页可访
- 介绍在 Go reflect 包里面对 Type 有一个 Comparable 的定义:package reflecttype Type i
- Adobe AIR 在我们国庆节的时候发布了beta2版。 同时发布的还有: FLEX 3.0 beta2 官方说这一版本已经基本上接近正式
- 紧接上篇文章,本篇文章讲vuex ,如何去改变state ,actions的使用,我依然使用了vuex的modules1.设置actions