1 安装命令
pip install Scrapy
2 创建项目:
scrapy startproject tutorial
项目结构:
tutorial/ scrapy.cfg tutorial/ __init__.py items.py pipelines.py settings.py spiders/ __init__.py
3 定义Item:Item 是保存爬取到的数据的容器
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 爬取命令 【可以查询日志的输出】
scrapy crawl dmoz
原理解释:
Scrapy为Spider的 start_urls 属性中的每个URL创建了 scrapy.Request 对象,
并将 parse 方法作为回调函数(callback)赋值给了Request。
Request对象经过调度,执行生成 scrapy.http.Response 对象并送回给spider parse() 方法。
6 Selectors选择器简介
/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 实例
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 保存数据
在 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脚本
来源:oschina
链接:https://my.oschina.net/u/2361669/blog/1563900