scrapy 简明开发步骤

本文详细介绍使用Scrapy框架进行网站爬取的过程,包括开发环境搭建、爬虫工程创建、字段定义、配置设置等关键步骤,并演示如何将数据存储到MySQL数据库。

1、开发环境

  • Win10、Python3.7、Anaconda、Pycharm、scrapy(version 1.6.0)

2、创建爬虫工程

Pycharm中运行Terminal,输入命令↓
cd路径
scrapy startproject 工程名
cd 工程名
scrapy genspider example example.com

3、修改 spider 中的 example.py

域名限制:
allowed_domains
要访问的url:
start_urls
导入item:
from …items import 工程名Item
修改parse:
item = 工程名Item()
parent_node = response.meta[‘parent_node’]
yield item
yield scrapy.Request(url, callback, meta={‘parent_node’: parent_node+1})

4、定义要爬取的字段:items.py

field = scrapy.Field()

ls = ['field1', 'field2', ...]
class 工程名Item(scrapy.Item):
    for fd in ls:
        exec(fd + '=scrapy.Field()')

5、配置:settings.py

浏览器伪装(line 19)

USER_AGENT = 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;360SE)'

爬虫协议(line 22)

ROBOTSTXT_OBEY = False

日志等级(bottom)

LOG_LEVEL = 'INFO'
# LOG_FILE = 'log.txt'

6、用 shell 预抓网页信息

scrapy shell 网址
response.text
response.xpath('').extract()
response.xpath('').re('')

7、创建启动程序,初步测试

工程目录下创建【z.py】(z排最下容易找),并写入↓

from scrapy import cmdline
# 储存json模式
# cmdline.execute('scrapy crawl example -t json -o 工程.json -s FEED_EXPORT_ENCODING="utf-8"'.split())
# 普通模式
cmdline.execute(['scrapy', 'crawl', 'example'])
# 不打印日志
# cmdline.execute(['scrapy', 'crawl', 'example', '--nolog'])

8、数据存储(MySQL)

  • 修改pipelines
  • 然后设置settings中的ITEM_PIPELINES(line 67)
from pymysql.connections import Connection
from time import strftime
database = 'z_test'  # 库名
table = 'industry'  # 表名
clear = lambda x: x.strip().replace("'", '"')if isinstance(x, str)else x

class IndustryPipeline(object):
    def open_spider(self, spider):
        self.db = Connection('localhost', 'root', 'yellow', database, charset='utf8')
        self.cursor = self.db.cursor()
    def close_spider(self, spider):
        self.cursor.close()
        self.db.close()
    def process_item(self, item, spider):
        dt = dict({'collect_date': strftime('%Y-%m-%d')}, **item)  # 采集日期
        ls = [(k, clear(v))for k, v in dt.items()if v is not None]
        sql = 'INSERT %s (' % table + ','.join(i[0] for i in ls) +\
              ')VALUES(' + ','.join('%r' % i[1] for i in ls) + ');'
        self.cursor.execute(sql)
        self.db.commit()
        return item
  • 常用建表sql
CREATE TABLE tb_name(
serial_number INT(9) AUTO_INCREMENT COMMENT '编号',
url CHAR(255) UNIQUE NOT NULL COMMENT '统一资源定位符',
title VARCHAR(255) COMMENT '标题',
detail TEXT COMMENT '细节',
price FLOAT(3,2) UNSIGNED DEFAULT 1.23 COMMENT '价格',
public_time DATETIME COMMENT '发布时间',
collect_date DATE COMMENT '采集日期',
PRIMARY KEY (`serial_number`,`url`)
);
DROP TABLE tb_name;

9、附图

这里写图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值