1 安装命令css
pip install Scrapy
2 建立项目: html
scrapy startproject tutorial
项目结构:python
tutorial/ scrapy.cfg tutorial/ __init__.py items.py pipelines.py settings.py spiders/ __init__.py
3 定义Item:Item 是保存爬取到的数据的容器ajax
import scrapy class DmozItem(scrapy.Item): title = scrapy.Field() link = scrapy.Field() desc = scrapy.Field()
4 Spider代码正则表达式
import scrapy class DmozSpider(scrapy.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): filename = response.url.split("/")[-2] with open(filename, 'wb') as f: f.write(response.body)
5 爬取命令 【能够查询日志的输出】django
scrapy crawl dmoz
原理解释:json
Scrapy为Spider的 start_urls 属性中的每一个URL建立了 scrapy.Request 对象, 并将 parse 方法做为回调函数(callback)赋值给了Request。 Request对象通过调度,执行生成 scrapy.http.Response 对象并送回给spider parse() 方法。
/html/head/title
: 选择HTML文档中 <head>
标签内的 <title>
元素/html/head/title/text()
: 选择上面提到的 <title>
元素的文字//td
: 选择全部的 <td>
元素//div[@class="mine"]
: 选择全部具备 class="mine"
属性的 div
元素Selector有四个基本的方法浏览器
xpath()
: 传入xpath表达式,返回该表达式所对应的全部节点的selector list列表 。css()
: 传入CSS表达式,返回该表达式所对应的全部节点的selector list列表.extract()
: 序列化该节点为unicode字符串并返回list。re()
: 根据传入的正则表达式对数据进行提取,返回unicode字符串list列表。7 demo 实例bash
import scrapy from tutorial.items import DmozItem class DmozSpider(scrapy.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
8 使用Item Pipeline 保存数据app
在 settings.py 中设置 ITEM_PIPELINES
,其默认为[]
,与 django 的 MIDDLEWARE_CLASSES
等类似。
从 Spider 的 parse 返回的 Item 数据将依次被 ITEM_PIPELINES
列表中的 Pipeline 类处理。
一个 Item Pipeline 类必须实现如下方法:
process_item(item, spider)
为每一个 item pipeline 组件调用,而且须要返回一个 scrapy.item.Item
实例对象或者抛出一个 scrapy.exceptions.DropItem
异常。当抛出异常后该 item 将不会被以后的 pipeline 处理。参数:
item (Item object)
– 由 parse 方法返回的 Item 对象spider (BaseSpider object)
– 抓取到这个 Item 对象对应的爬虫对象也可额外的实现如下两个方法:
open_spider(spider)
当爬虫打开以后被调用。参数: spider (BaseSpider object)
– 已经运行的爬虫close_spider(spider)
当爬虫关闭以后被调用。参数: spider (BaseSpider object)
– 已经关闭的爬虫9 使用Feed exports保存数据:
scrapy crawl dmoz -o items.json
tips: ITEM_PIPELINES 为空 才能保存到本地
拓展: 用django的debug模式启动 须要本身配置脚本manage.py:
#-*-coding:utf-8 -*- #经过调用命令行进行调试 __author__ = "james" __date__ = "2017/11/9 14:41" #调用execute这个函数可调用scrapy脚本 from scrapy.cmdline import execute #设置工程命令 import sys import os #设置工程路径,在cmd 命令更改路径而执行scrapy命令调试 #获取main文件的父目录,os.path.abspath(__file__) 为__file__文件目录 sys.path.append(os.path.dirname(os.path.abspath(__file__))) execute(["scrapy", "crawl", {spider_name}])
同时运行多个爬虫的脚本:
manage.py
from spiders.mydomain import MydomainSpider from spiders.steam_spider import SteamSpider from scrapy.utils.project import get_project_settings from scrapy.crawler import CrawlerProcess process = CrawlerProcess(get_project_settings()) process.crawl(SteamSpider) process.crawl(MydomainSpider) process.start()
参考:http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html
拓展:
反爬虫 方法: 1 检测用户行为,例如同一IP短期内屡次访问同一页面,或者同一帐户短期内屡次进行相同操做。 破解方法:能够专门写一个爬虫,爬取网上公开的代理ip,检测后所有保存起来。 这样的代理ip爬虫常常会用到,最好本身准备一个。有了大量代理ip后能够每请求几回更换一个ip 2 动态页面 数据是经过ajax请求获得,或者经过JavaScript生成的 参数通过加密 破解方法:selenium+phantomJS 我用的是selenium+phantomJS框架,调用浏览器内核, 并利用phantomJS执行js来模拟人为操做以及触发页面中的js脚本