介绍

本篇涉及的内容主要是获取分类下的所有图书数据,并写入MySQL

准备

Python3.6、Scrapy、Twisted、MySQLdb等

演示

代码一、创建项目1

2scrapy startproject BookSpider #创建项目

scrapy genspider douban book.douban.com #创建豆瓣爬虫二、创建测试类(main.py)1

2from scrapy.cmdline import execute

execute(['scrapy', 'crawl', 'douban'])三、修改配置(spiders/settings.py)1

2USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' #浏览器

ROBOTSTXT_OBEY = False #不遵循豆瓣网站的爬虫协议四、设置爬取的分类(spiders/douban.py)1start_urls = ['https://book.douban.com/tag/神经网络'] # 只测试爬取神经网络五、获取分类列表页图书数据

1

2

3

4

5

6

7

8

9

10

11

12

13

14from scrapy.http import Request

from urllib.parse import urljoin

def parse(self, response):

get_nodes = response.xpath('//div[@id="subject_list"]/ul/li/div[@class="pic"]/a')

for node in get_nodes:

url = node.xpath("@href").get()

img_url = node.xpath('[email protected]').get()

yield Request(url=url, meta={"img_url": img_url}, callback=self.parse_book) # 传递img_url值 放在meta里面, parse_book回调函数,获取的详情再分析

next_url = response.xpath('//div[@class="paginator"]/span[@class="next"][email protected]').get() # 获取下一页地址

if(next_url):

yield Request(url=urljoin(response.url, next_url), callback=self.parse) # 获取下一页内容六、定义数据模型(spiders/items.py)1

2

3

4

5

6

7

8

9

10

11

12

13

14class BookspiderItem(scrapy.Item):

# define the fields for your item here like:

# name = scrapy.Field()

name = scrapy.Field()

author = scrapy.Field()

publish = scrapy.Field()

page_num = scrapy.Field()

isbm = scrapy.Field()

binding = scrapy.Field()

publish_date = scrapy.Field()

price = scrapy.Field()

rate = scrapy.Field()

img_url = scrapy.Field()

image_path = scrapy.Field()七、获取图书详情数据

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24import re

from BookSpider.items import BookspiderItem

def parse_book(self, response):

BookItem = BookspiderItem()

BookItem['name'] = response.xpath('//span[@property="v:itemreviewed"]/text()').get("").strip()

BookItem['author'] = response.xpath('//span[contains(text(), "作者")]/following-sibling::a[1]/text()').get("").split()[-1]

BookItem['publish'] = response.xpath('//span[contains(text(), "出版社")]/following-sibling::text()').get("").strip()

page_num = response.xpath('//span[contains(text(), "页数")]/following-sibling::text()').get("").strip()

BookItem['page_num'] = 0 if(page_num == '') else page_num

BookItem['isbm'] = response.xpath('//span[contains(text(), "ISBN")]/following-sibling::text()').get("").strip()

BookItem['binding'] = response.xpath('//span[contains(text(), "装帧")]/following-sibling::text()').get("").strip()

BookItem['publish_date'] = response.xpath('//span[contains(text(), "出版年")]/following-sibling::text()').get("").strip()

price = response.xpath('//span[contains(text(), "定价")]/following-sibling::text()').get("").strip()

BookItem['price'] = '' if(len(price) == 0) else re.findall(r'd+.?d*', price)[0]

BookItem['rate'] = response.xpath('//div[contains(@class, "rating_self ")]/strong/text()').get("").strip()

BookItem['img_url'] = [response.meta.get('img_url')] #图片是列表

yield BookItem八、下载图片

1、创建images文件加

2、配置spiders/settings.py1

2

3

4

5ITEM_PIPELINES = {

'BookSpider.pipelines.ImageStorePipeline': 1, #后面的数据是优先级

}

IMAGES_URLS_FIELD = "image_url"

IMAGES_STORE = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'images')

3、创建ImageStorePipeline类(spiders/pipelines.py)1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24from scrapy.pipelines.images import ImagesPipeline

from scrapy.exceptions import DropItem

from scrapy.http import Request

class ImageStorePipeline(ImagesPipeline):

default_headers = {

'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',

'accept-encoding': 'gzip, deflate, br',

'accept-language': 'zh-CN,zh;q=0.9',

'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36', #这个一定要

}

def get_media_requests(self, item, info):

for image_url in item['img_url']:

self.default_headers['referer'] = image_url

yield Request(image_url, headers=self.default_headers)

def item_completed(self, results, item, info):

image_path = [x['path'] for ok, x in results if ok]

if not image_path:

raise DropItem("Item contains no images")

item['image_path'] = image_path

return item八、写入数据库

1、配置spiders/settings.py1

2

3

4

5

6

7

8

9#设置数据库

MYSQL_HOST = ""

MYSQL_DBNAME = ""

MYSQL_USER = ""

MYSQL_PASSWORD = ""

ITEM_PIPELINES = {

'BookSpider.pipelines.ImageStorePipeline': 1,

'BookSpider.pipelines.MysqlTwistedPipeline': 30,

}

2、创建MysqlTwistedPipeline类(spiders/pipelines.py)1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28import MySQLdb.cursors

from twisted.enterprise import adbapi

class MysqlTwistedPipeline(object):

def __init__(self, dbpool):

self.dbpool = dbpool

@classmethod #静态方法,会优先执行from_settings, 这样self.dbpool就有值了

def from_settings(cls, settings):

dbpool = adbapi.ConnectionPool("MySQLdb", host=settings['MYSQL_HOST'], db = settings['MYSQL_DBNAME'], user = settings['MYSQL_USER'], passwd = settings['MYSQL_PASSWORD'], charset = 'utf8', cursorclass = MySQLdb.cursors.DictCursor, use_unicode = True)

return cls(dbpool)

def process_item(self, item, spider):

query = self.dbpool.runInteraction(self.do_insert, item)

query.addErrback(self.handle_error,item,spider)

def do_insert(self, cursor, item):

insert_sql = """

insert into douban(name, author, publish, page_num, isbm, binding, publish_date, price, rate, img_url, image_path)

values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)

"""

cursor.execute(insert_sql, (item['name'], item['author'], item['publish'], item['page_num'], item['isbm'], item['binding'], item['publish_date'], item['price'], item['rate'], item['img_url'], item['image_path']))

def handle_error(self, failure, item, spider):

print(failure)九、测试

1、执行main.py文件

爬取豆瓣评论连接mysql_Scrapy爬取豆瓣图书数据并写入MySQL相关推荐

  1. pipelines mysql_Scrapy爬取豆瓣图书数据并写入MySQL

    介绍 本篇涉及的内容主要是获取分类下的所有图书数据,并写入MySQL 准备 Python3.6.Scrapy.Twisted.MySQLdb等 演示 代码 一.创建项目 scrapy startpro ...

  2. python爬取新闻并归数据库_Python爬取数据并写入MySQL数据库操作示例

    Python爬取数据并写入MySQL数据库的实例 首先我们来爬取 http://html-color-codes.info/color-names/ 的一些数据. 按 F12 或 ctrl+u 审查元 ...

  3. python爬取mysql数据_Python爬取数据并写入MySQL数据库的实例

    Python爬取数据并写入MySQL数据库的实例 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  Python爬取数据并写入MySQL数据库的实例.txt ] (友 ...

  4. python爬取新闻存入数据库_Python爬取数据并写入MySQL数据库的实例

    按 F12 或 ctrl+u 审查元素,结果如下: 结构很清晰简单,我们就是要爬 tr 标签里面的 style 和 tr 下几个并列的 td 标签,下面是爬取的代码: #!/usr/bin/env p ...

  5. python爬取歌曲评论_python+requests爬取豆瓣歌曲评论

    1 #-*- coding: utf-8 -*- 2 ''' 3 Created on 2018年8月14日4 5 @author: zww6 7 ''' 8 importtime9 importre ...

  6. php抓取微博评论,python爬虫爬取微博评论案例详解

    前几天,杨超越编程大赛火了,大家都在报名参加,而我也是其中的一员. 在我们的项目中,我负责的是数据爬取这块,我主要是把对于杨超越 的每一条评论的相关信息. 数据格式:{"name" ...

  7. python爬取京东评论分析_Python爬取京东商品评论+制作关键字云+情感分析图

    首先我们要了解一下,我们用requests包爬取的都只是写在HTML页面上的数据,但是呢,现在很多网站的数据都是通过js代码生成的,除非你找到它,不然是爬取不到的. 首先我随意打开一个京东的商品的详情 ...

  8. Python爬取数据并写入MySQL

    关于爬虫爬取数据并存入MySQL数据库(以东方财富网上的股票数据为例,网页:深南电A(000037)资金流向 _ 数据中心 _ 东方财富网) 第一步,创建数据库中的数据表 import request ...

  9. 爬取数据并写入MySQL数据库

    1.爬取思路总结概述: a.请求网页,获取json数据:request函数 b.使正则re 模块,提取出 { {--} }信息所在部分的字典 :re.search() c.为了防止连续请求中出现,IP ...

  10. python 豆瓣评论删除_Python抓取豆瓣《白夜追凶》的评论并且分词

    最近网剧<白夜追凶>在很多朋友的推荐下,开启了追剧模式,自从琅琊榜过后没有看过国产剧了,此剧确实是良心剧呀!一直追下去,十一最后两天闲来无事就抓取豆瓣的评论看一下 相关代码提交到githu ...

最新文章

  1. LINUX下配置bashrc文件/ PATH环境变量修改/别名/提示符
  2. loadrunner参数化excel数据
  3. session 和cookie的理解
  4. linux管道学习资料
  5. Selenium爬虫 -- WebDriver多标签页创建与切换
  6. 【C语言数据结构】数组
  7. win10系统下SQL2012下载及安装
  8. EOS区块链技术开发(二)智能合约
  9. 2021年12月13日|14日|15日|16日|17日
  10. Android——超简单悬浮窗使用教程
  11. UEFI是什么意思?UEFI和BIOS的区别是什么?
  12. 【应用】Markdown 在线阅读器
  13. 按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值。其中,m和n的值由用户键盘输入。已知m和n的值都不超过10。
  14. 两种编写代码风格方式对比
  15. 软通22年秋季新员工入职考试
  16. 如何用Python自动爬取全国30+城市地铁图数据?
  17. Apache OJB的分页处理
  18. VST SDK 3.x 开发(一):VST结构介绍
  19. 爬取电影天堂电影信息
  20. java 级联删除_java 级联删除文件夹下的所有文件

热门文章

  1. NYOJ - 整数划分(四)
  2. Widget改变大小
  3. 过滤字符串 和 select选择后控件值变更
  4. Item 22. 模板方法与曲线救国(Template Method)
  5. Harris角点检测算法 1
  6. 新风系统风速推荐表_谈实验室通风系统设计
  7. hadoop学习笔记01
  8. 机器人操作系统ROS(一):发布接收消息
  9. catia如何将曲面加厚变为实体_?在CATIA中快速画一个大众车标
  10. pytorch进度条