python scrapy框架进行页面数据抓取

第一部分爬虫架构介绍

1.Spiders(自己书写的爬虫逻辑,处理url及网页等【spider genspider -t 指定模板  爬虫文件名 域名】),返回Requests给engine——>

2.engine拿到requests返回给scheduler(什么也没做)——>

3.然后scheduler会生成一个requests交给engine(url调度器)——>

4.engine通过downloader的middleware一层一层过滤然后将requests交给downloader——>

5.downloader下载完成后又通过middleware过滤将response返回给engine——>

6.engine拿到response之后将response通过spiders的middleware过滤后返回给spider,然后spider做一些处理(如返回items或requests)——>

7.spiders将处理后得到的一些items和requests通过中间件过滤返回给engine——>

8.engine判断返回的是items或requests,如果是items就直接返回给item pipelines,如果是requests就将requests返回给scheduler(和第二步一样) 

第二部分爬虫组件介绍

scrapy Engine引擎:

负责spider, itemPipeline,Downloader,Scheduler中间的通讯信号数据传递等

scheduler调度器:

负责接受引擎发送来的request请求 存放url

Downloader(下载器):

负责接受引擎从调度器中拿到的url并下载html获得请求体

spiser(爬虫):

  1. 负责接受引擎从下载器中拿到的请求体来提取我们需要的数据
  2. 提取新的url给调度器

ltem Pipeline(管道):

负责接受引擎从spider中提取到的数据来对其进行过滤存储等

下载中间件:自定义下载组件(请求任务和响应结果都会经过下载中间件)
代理中间件,cookies中间件,User—Agent中间件,selenium中间件

爬虫中间件:可以自定义request请求和过滤Response响应

第三部分代码结构介绍

Spider
    |- scrapy.cfg                        项目部署文件
    |- Spider                     该项目的python模块,可以在这里加入代码
        |- __init__.py                 
        |- items.py                       主要是将爬取的非结构性的数据源提取结构性数据
        |- middlewares.py          
        |- pipelines.py                  将爬取的数据进行持久化存储
        |-  __pycache__  
        |-  settings.py                  配置文件
        |-  spiders                       放置spider代码的目录
            |-  __init__.py 
            |-  __pycache__

第四部分实战

python3.6安装scrapy包

pip install scrapy

创建爬虫项目

scrapy startproject demotest

编辑项目

用python打开新建的demotest

新建testspider.py,并编辑spider

import scrapy
from scrapy import selector
from scrapy.spiders import CrawlSpider
from demotest.items import myspider1
from scrapy import Request
from scrapy.selector import Selector
from scrapy.crawler import CrawlerProcess

class mySpider1(scrapy.Spider):
    name = 'mySpider1'
    allowed_domains = ['www.cnblogs.com']
    start_urls = ["http://www.cnblogs.com/"]

    def parse(self,response):
        item = response.xpath('//*[@id="post_list"]/div[1]/div[2]/h3/a/text()').extract()
        yield item
        print(item)

在items.py中添加myspider1的item类

class myspider1(scrapy.Item):
    # define the fields for your item here like:
    #倒序排列
    summary = Field()
    title = Field()

运行myspider1输出到csv中

scrapy crawl myspider1 -o info20200319.csv

数据输出结果

csv格式输出和mysql格式输出

编辑pipelines.py

添加csv抓取类和mysql读取类

在setting.py中添加数据库参数,并打开pipeline的设置

import csv
from .items import dl_jianshe,eastmoney
import pymysql
import pymysql.cursors
from twisted.enterprise import adbapi
import WangScrapyTest.settings
from scrapy.utils.project import get_project_settings



class CsvWriterPipeline(object):
    # 存储数据到指定的csv文件
    def process_item(self, item, spider):
        #不同的item数据存储在不同的csv文件中
        if item.__class__ == dl_jianshe:
            with open('/Users/username/Documents/NINE/testdata/dl_jianshe.csv', 'a+', encoding='gbk', newline='') as fp:
                writer = csv.writer(fp)
                writer.writerow([item['name'], item['area'], item['time'], item['url']])
            return item
        if item.__class__ == eastmoney:
            with open('/Users/zhangfei/Documents/NINE/testdata/stock.csv', 'a+', encoding='gbk', newline='') as fp:
                writer = csv.writer(fp)
                writer.writerow([item['stockeCodeNum'], item['stockeName'], item['stockPrice'], item['stockRate']])
            return item

#数据库同步操作
class WangscrapytestPipeline(object):
    '''
    create database spider DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
use spider;
CREATE TABLE spider_jianshe (
    dname VARCHAR(256) NOT NULL, # 字段名
    area VARCHAR(150), # 地区
    dtime TIMESTAMP, # 时间
    link_url VARCHAR(256), # url
)
    '''
    def __init__(self):
        # 连接数据库
        settings = get_project_settings()
        self.connect = pymysql.connect(
            host=settings['MYSQL_HOST'],
            #port = settings['MYSQL_POST'],
            db=settings['MYSQL_DBNAME'],
            user=settings['MYSQL_USER'],
            passwd=settings['MYSQL_PASSWD'],
            charset='utf8',
            use_unicode=True)

        # 通过cursor执行增删查改
        self.cursor = self.connect.cursor()
        print("连接数据库成功")
    def process_item(self, item, spider):
        if item.__class__ == dl_jianshe:
            try:
                # 查重处理
                self.cursor.execute(
                    """select * from spider_jianshe where dname = %s""",
                    item['name'])
                # 是否有重复数据
                repetition = self.cursor.fetchone()

                # 重复
                if repetition:
                    print( "这条数据已经存在")
                else:
                    self.cursor.execute(
                        """
                        insert into spider_jianshe(dname, area, dtime, link_url) values(%s,%s,%s,%s) 
                        """,
                        (item['name'],
                         item['area'],
                         item['time'],
                         item['url'])

                    )
                self.connect.commit()
            except Exception as error:
                #log(error)
                print("error")
            return item

    def close_spider(self, spider):
        # 关闭游标和连接
        self.cursor.close()
        self.connect.close()

settings.py

MYSQL_HOST = '10.10.10.10'
MYSQL_DBNAME = 'spider'
MYSQL_USER = 'spider'
MYSQL_PASSWD = 'spider'
MYSQL_PORT = 3306


ITEM_PIPELINES = {
    'demotest.pipelines.CsvWriterPipeline': 300,
    'demotest.pipelines.WangscrapytestPipeline': 300, #验证通过
    
}

项目运行

scrapy crawl spidername即可

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值