scrapy+pymongo爬取符号库所有拼音开头文字
今天又看了一下mongo数据库的基本使用,虽然还不明白分布式爬虫这种高级概念,但是简单使用一下还是可以的,全当拿来练手。
- mongodb的安装以及使用可以查看MongoDB中文网
- pymongo的安装 pip install pymongo 即可,使用的话可以查看这篇文章
- scrapy的基础概念我上篇都有讲,并且这些基础概念都是可以搜索到
这次我们爬取的是这个网站,数据库结构大致如下
分析网站
先让我们看一下网站界面,标红为要爬取的数据,就两条
用xpath helper 获取一下
总结一下
title >> “//tr/th/text()”
content >> “//tr/td/p/text()”这些数据都被放在table表格里,我的思想是:一行一行的获取这些数据,在遇到一个 title 时就将数据传给管道进行入库,直到 “[a-z]开头汉字大全” 遍历完。
创建项目
scrapy startproject Fuhaoku
创建爬虫
scrapy genspider hanzi
首先修改settings.py
进入 items.py 编写结构
import scrapy
class FuhaokuItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
content = scrapy.Field()
编写爬虫 hanzi.py
import scrapy
from fuhaoku.items import FuhaokuItem
class HanziSpider(scrapy.Spider):
name = 'hanzi'
allowed_domains = ['www.fuhaoku.net']
start_urls = ['https://www.fuhaoku.net/zi/']
def parse(self, response):
item = FuhaokuItem()
trs = response.xpath("//tbody/tr")
# 获取第一个 ?开头汉字大全
head = trs.xpath("./th/p/text()").get()
# ?开头的所有 拼英汉字
zi = []
# 行 循环
# 如果不是标题,则加入 列表 zi
# 如果是标题,判断是否 head 一致,不一致则表示已记录到一个字母开头的所有字并添加进 item
for tr in trs:
if tr.xpath("./th"):
if head != tr.xpath("./th/p/text()").get():
item['title'] = head
head = tr.xpath("./th/p/text()").get()
item['content'] = zi
zi = []
# print(item['title'], item['content'], sep="\n")
yield item
else:
for i in tr.xpath("./td/p/text()").getall():
zi.append(i.strip().replace(r'\r\n',''))
item['title'] = head
item['content'] = zi
# print(item['title'], item['content'], sep="\n")
yield item
创建管道
编写管道 pipelines.py
import pymongo
class FuhaokuPipeline(object):
def __init__(self):
# 连接服务器
client = pymongo.MongoClient(host='127.0.0.1',port=27017)
# 创建数据库
db = client.Fuhaoku
# 建立集合
self.collection = db.hanzi
def process_item(self, item, spider):
data = dict(item)
# print(data)
self.collection.insert(data)
return item
运行爬虫
见证奇迹的时刻到了
scrapy crawl hanzi
进入cmd,键入 mongo
查看所有库 show dbs
进入库 use Fuhaoku
查看当前库 db
查看爬取的数据 db.hanzi.find().pretty()
查看一条数据
大功告成 ^ . ^