Scrapy爬虫与MySQL的首次实战————爬取当当网的商品数据 2020/5/4
一、MySQL下载安装等问题
1.下载
首先想着从官网直接下载,最开始下载速度还挺好的,告诉我还有5分钟就能完事。然后我等了十分钟,发现进度条似乎死在了75%的位置,再一看还有5h下完。果断放弃!
等等,为什么官网上有个大小不到50mb的版本,后来发现是web-community版本,即下载后再进行安装时会重新从网络上下载所需的组件,而选择的另一个则是下载到本地之后直接解压就能安装完毕的版本。尝试换为web版,下载成功!接下来安装真心卡,好不容易进行到最后的地方结果又有一个组件死活下载不下来,放着下了一晚上,从0到80%然后就彻底停下来了。
最后怎么解决的呢?重新下载了本地安装版本,不过这次是通过清华的镜像源下载,国内就是快啊。很快下载就完成了,之后解压一下,放到自己喜欢的位置就ok了。
2.初始化
然而令人头疼的是解压完之后运行不了MySQL的任何.exe文件,告诉我缺少VCRUNTIME140_1.dll文件,还说重新安装可能会解决该问题。于是我就开始了半个小时的重新解压安装,换镜像源下载解压,但是一直存在这个问题。
最后我想着,既然你说缺少这个.dll文件,那我就找找是不是少,少了就下一个吧。然后在C盘搜索system32文件夹,再在其中搜索这个文件,发现装有VCRUNTIME140.dll文件但还真没有提示信息了的。于是下载加到system32物文件夹,万事大吉——————才怪!!!
再次实验发现依旧无法打开但是提示信息变了,着说明我们离胜利又进了一步,这次的提示是(0xc00000ba),于是乎百度搜索看看啥子情况。结果一眼看去全是安装游戏或者杀毒软件的同志们在提问,似乎没有程序员大佬们的身影。
没有前辈的经验借鉴,只好自己处理了,换了台电脑安装,结果同样要导入VCRUNTIME140_1.dll文件,不同的是这次我直接导入到了,MySQL的文件夹中,打开cmd运行成功了!!!于是照搬到第一台电脑上(这台电脑没有python,实在不想再下一次)总算是完成了初始化。
另外,有可能需要让cmd以管理员身份运行:
使用就ok了:
二、Scrapy爬虫编写
在此之前,花了几周闲暇时间学习python和urllib库的爬虫操作(在这里我想吐槽由于大数据导论,这门本该大三上的课程被学院调整到大一之后仍然要完成同样的项目的操作实在是太秀了)现在总算是进军scrapy爬虫了
1.items
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
# 以上为basic模板的爬虫自带的信息
import scrapy
class DangdangItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
link = scrapy.Field()
comment = scrapy.Field()
price = scrapy.Field()
#需要的信息有商品名,商品链接,商品评论数(不是评论,那个会有单独的爬虫进行)和价格
构造容器,分别装上爬取的内容。
2.spider
# -*- coding: utf-8 -*-
import scrapy
from dangdang.items import DangdangItem
from scrapy.http import Request
class DdSpider(scrapy.Spider):
name = 'dd'
allowed_domains = ['dangdang.com']
start_urls = ['http://category.dangdang.com/pg1-cp98.01.54.00.00.00.html']
def parse(self, response):
item = DangdangItem()
item['title'] = response.xpath('//a[@name="itemlist-title"]/@title').extract() #封存list
item['link'] = response.xpath('//a[@name="itemlist-title"]/@href').extract()
item['comment'] = response.xpath('//a[@name="itemlist-review"]/text()').extract()
listofprice = response.xpath('//span[@class="search_now_price"]/text()').extract()
item['price'] = [x.replace('\xa5', '') for x in listofprice]
#发现Xpath表达式提取的价格前面会多出来这个'\xa5'就利用列表生成器将之处理掉了
#print(item['title']) #测试
yield item
#每提取一页就交给pipelines进行处理,接下来实现自动翻页
for i in range(2, 75):
url = 'http://category.dangdang.com/pg' + str(i) + '-cp98.01.54.00.00.00.html'
yield Request(url,callback = self.parse)
3.pipelines
pipelines是处理爬取数据的py文件
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
import pymysql
class DangdangPipeline:
def process_item(self, item, spider):
conn = pymysql.connect(host = '127.0.0.1', user = 'root', passwd = 'Hust2020', db = 'dangdang')
conn.autocommit(True) #自动提交到sql,没有这一句是无法自动完成sql语句的执行的
cur = conn.cursor() #设置光标
create_table = 'create table if not exists csbooks1(title varchar(100), link varchar(100), comment varchar(100), price varchar(100));' #构建table
cur.execute(create_table)
for i in range(len(item['title'])):
title = item['title'][i]
link = item['link'][i]
comment = item['comment'][i]
price = item['price'][i]
#print(title + '\n' + link + '\n' + comment + '\n' + price)
sql = "insert into csbooks1(title, link, comment, price) values ('" + title + "','" + link + "','" + comment + "','" + price + "');" #构造sql语句
#conn.query(sql) #执行sql语句
try:
cur.execute(sql)
except Exception as err:
print(err)
conn.close()
return item
4.settings
直接运行爬虫的话会出大问题,你啥也拿不到,因为我们爬取的网站通过ROBOT协议阻止了我们的“攻击行为”,所以我们需要设置我们的爬虫不遵循ROBOT协议,但是一定要注意不要真的做那些过火的事情:
# Obey robots.txt rules
ROBOTSTXT_OBEY = False #默认为TRUE
三、最终效果:
在MySQL系统中找到自己的database,然后通过指令语句:
mysql> select * from csbooks1 limit 50;
结果为:
看看爬取的条数:(好像74页内容吧)
总结:
距离成功完成IBD的任务还很远,需要继续学,五月底我们行吗?