Scrapy的使用方法

Scrapy框架

什么是scrapy

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需要实现少量的代码,就能够快速的抓取。

文件目录

scrapy.cfg    #项目的配置文件
items.py      #提取要爬取的字段,字典保存爬取到的数据的容器
middlewares   #自定义中间件的地方
pipelines.py  #管道,保存数据
settings.py   #项目的设置文件 设置文件,UA,启动管道
spiders       #存储爬虫代码目录
    itcast.py   #写爬虫的文件

爬虫步骤:

1.创建一个scrapy项目
scrapy startproject mySpider   #mySpider是项目名字
2.生成一个爬虫
scrapy genspider itcast itcast.cn  #itcast是爬虫名字,"itcast.cn"限制爬虫地址,防止爬到其他网站
3.提取数据
完善spiders,使用xpath等方法
4.启动爬虫
scrapy crawl 爬虫名字    #crawl(抓取的意思)
image.png

spider内容

spider翻页

# -*- coding: utf-8 -*-
import scrapy
#导入items
from tencent.items import TencentItem

#自定义spider类,继承自scrapy.Spider
class ItcastSpider(scrapy.Spider):
    name = 'itcast' #爬虫名字<爬虫启动时候使用:scrapy crawl itcast>
    #允许爬取的范围,防止爬虫爬到了别的网站
    allowed_domains = ['tencent.com']
    #开始爬取的地址,下载中间件提取网页数据
    start_urls = ['https://hr.tencent.com/position.php']
    #数据提取方法,接收下载中间件传过来的response(响应)
    def parse(self, response):
        #处理start_url地址对应的响应
        #提取数据
        # reti = response.xpath("//div[@class='tea_con']//h3/text()").extract()
        # print(reti)

        #分组,[1:-1]切片,不要第一条数据
        li_list = response.xpath("//table[@class="tablelist"]/tr")[1:-1]
        for li in li_list:
            #在item中定义要爬取的字段,以字典形式传入
            item = TencentItem()
            item["name"] = li.xpath(".//h3/text()").extract_first()
            item["title"] = li.xpath(".//h4/text()").extract_first()
            #yield可以返回request对象,BaseItem(items.py中的类),dict,None
            yield item  #yield传到pipeline
        #找到下一页url地址
        next_url = response.xpath('//a[@id="next"]/@href').extract_first()
        #如果url地址的href="地址"不等于javascript:;
        if next_url != "javascript:;":
            next_url = "https://hr.tencent.com/"+ next_url
            #把next_url的地址通过回调函数callback交给parse方法处理
            yield scrapy.Request(next_url,callback=self.parse)

爬取详细页和翻页

# -*- coding: utf-8 -*-
import scrapy
from yangguang.items import YangguangItem

class YgSpider(scrapy.Spider):
    name = 'yg'
    allowed_domains = ['sun0769.com']
    start_urls = ['http://wz.sun0769.com/index.php/question/questionType?type=4&page=0']

    def parse(self, response):
        tr_list = response.xpath("//div[@class='greyframe']/table[2]/tr/td/table/tr")
        for tr in tr_list:
            item = YangguangItem()
            item["title"] = tr.xpath("./td[2]/a[@class='news14']/@title").extract_first()
            item["href"] = tr.xpath("./td[2]/a[@class='news14']/@href").extract_first()
            item["publish_date"] = tr.xpath("./td[last()]/text()").extract_first()
            #执行进入url地址,再把item传到下面parse_detail,提取详细页的内容
            yield scrapy.Request(item["href"],callback=self.parse_detail,meta={"item":item})
        #翻页
        #获取url地址
        next_url = response.xpath("//a[text()='>']/@href").extract_first()
        #如果下一页url地址不为空,进入下一页连接
        if next_url is not None:
            yield scrapy.Request(next_url,callback=self.parse)

    #处理详情页
    def parse_detail(self,response):
        #item接收meta传过来的item,在item字典里继续为item添加内容
        item = response.meta["item"]
        #拿到详细页的内容
        item["content"] = response.xpath("//div[@class='c1 text14_2']//text()").extract()
        #拿到详细页的图片地址
        item["content_img"] = response.xpath("//div[@class='c1 text14_2']//img/@src").extract()
        #给图片前面加上http://wz.sun0769.com
        item["content_img"] = ["http://wz.sun0769.com" + i for i in item["content_img"]]
        #把item传给pipeline
        yield item

items(存储爬取字段)

import scrapy
#scrapy.Item是一个字典
class TencentItem(scrapy.Item):
#scrapy.Field()是一个字典
url = scrapy.Field()
name = scrapy.Field()

使用pipeline(管道)

from demo1 import settings
import pymongo

class Demo1Pipeline(object):
    def __init__(self):
        #连接mongodb数据库(数据库地址,端口号,数据库)
        client = pymongo.MongoClient(host=settings.MONGODB_HOST, port=settings.MONGODB_PORT)
        #选择数据库和集合
        self.db = client[settings.MONGODB_DBNAME][settings.MONGODB_DOCNAME]
    def process_item(self, item, spider):
        data = dict(item)
        self.db.insert(data)

#完成pipeline代码后,需要在setting中设置开启
ITEM_PIPELINES = {
  #开启管道,可以设置多个管道,'管道地址数值':越小越先执行
  'mySpider.pipelines.MyspiderPipeline': 300,
}
# MONGODB 主机环回地址127.0.0.1
MONGODB_HOST = '127.0.0.1'
# 端口号,默认是27017
MONGODB_PORT = 27017
# 设置数据库名称
MONGODB_DBNAME = 'DouBan'
# 存放本次数据的表名称
MONGODB_DOCNAME = 'DouBanMovies'
注意
  • pipeline中process_item方法名不能修改,修改会报错
  • pipeline(管道)可以有多个
  • 设置了pipelines必须开启管道,权重越小优先级越高

把数据保存到mongodb中

#导入mongodb的包
from pymongo import MongoClient
#实例化client,建立连接
client = MongoClient(host='127.0.0.1',port = 27017)
#选择数据库和集合
collection = client["tencent"]["hr"]

class TencentPipeline(object):
    def process_item(self, item, spider):
        #传过来的数据是对象,把item转化为字典
        item = dict(item)
        #把数据存入mongodb数据库
        collection.insert(item)
        print(item)
        return item
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml 下载即可。 安装...
    怂恿的大脑阅读 1,242评论 0 7
  • scrapy学习笔记(有示例版) 我的博客 scrapy学习笔记1.使用scrapy1.1创建工程1.2创建爬虫模...
    陈思煜阅读 12,653评论 4 46
  • 你写信给我的时候,希望你在想着要来有我的这座城市。 我与翠的重逢是在大学的时候,我们是初中同学,她...
    茶汤官阅读 134评论 0 3
  • 制作|米粒 端午节,小雨淅淅沥沥,哪儿也不能去,米粒同学只好在家写作业。 酷爱美术、手工的米粒同学趁着争取来的休息...
    印记_成长阅读 1,297评论 2 2
  • 有时候看身边的朋友选专业寥寥草草,我真的很惊讶,多么重要的事情,竟也敢如此草率,到现在想来,没有谁对某一事物100...
    OnlyNannan阅读 211评论 0 0