基于Python语言,利用Scrapy框架爬取信息,并持久化存储在MySQL
打开cmd或者powershell,然后输入scrapy startproject
+你的项目名
然后 cd 到你项目名的下级目录之后再输入以下命令,scrapy genspider
+名字+你要爬取网站的域名【!!!注意一定是域名,而不是URL】
定义你待会需要爬取的字段,代码如下:
import scrapy
class QunartravelItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
Title = scrapy.Field()
TravelLink = scrapy.Field()
Date = scrapy.Field()
Days = scrapy.Field()
Photo_Nums = scrapy.Field()
Fee = scrapy.Field()
People = scrapy.Field()
Places = scrapy.Field()
Views = scrapy.Field()
Love = scrapy.Field()
Comment = scrapy.Field()
# Title:文章标题
# TravelLink:标题的链接
# Date:出发日期
# Days:旅游共几天
# Photo_Nums:照片数量
# Fee:人均消费
# People:适合人数
# Places:途径地点
# Views:评论人数
# Love:点赞数
# Comment:评论数
这个文件在spiders的文件夹下的py文件,用于编写爬取网站信息的代码,我这里用的简单的xpath即可获取网页对应字段信息,代码如下:
import scrapy
from QunarTravel.items import QunartravelItem
class QunarSpider(scrapy.Spider):
name = 'Qunar'
allowed_domains = ['travel.qunar.com']
start_urls = ['http://travel.qunar.com/']
urls = "https://travel.qunar.com/travelbook/list.htm?page={}&order=hot_heat"
def start_requests(self):
for i in range(1,201):
url = self.urls.format(i)
yield scrapy.Request(url=url,callback=self.parse)
def parse(self, response):
item = QunartravelItem()
for info,num in zip(response.xpath('//li[@class="list_item "]'),range(1,2000)):
try:
item['Title'] = info.xpath('.//h2[@class="tit"]/a/text()').extract()[0]
item['TravelLink'] = info.xpath('.//h2[@class="tit"]/a/@href').extract()[0]
item['Date'] = info.xpath('.//p[@class="user_info"]/span[1]/span[@class="date"]/text()').extract()[0]
item['Days'] = info.xpath('.//p[@class="user_info"]/span[1]/span[@class="days"]/text()').extract()[0]
item['Photo_Nums'] = info.xpath('.//p[@class="user_info"]/span[1]/span[@class="photo_nums"]/text()').extract()[0]
item['Fee'] = info.xpath('.//p[@class="user_info"]/span[1]/span[@class="fee"]/text()').extract()[0]
item['People'] = info.xpath('.//p[@class="user_info"]/span[1]/span[@class="people"]/text()').extract()[0]
item['Places'] = info.xpath('.//p[@class="places"]/text()').extract()[0]
item['Views'] = info.xpath('.//p[@class="user_info"]/span[2]/span[@class="icon_view"]/span/text()').extract()[0]
item['Love'] = info.xpath('.//p[@class="user_info"]/span[2]/span[@class="icon_love"]/span/text()').extract()[0]
item['Comment'] = info.xpath('.//p[@class="user_info"]/span[2]/span[@class="icon_comment"]/span/text()').extract()[0]
print("第{}条记录爬取成功".format(num))
except IndexError:
print("第{}条记录爬取失败".format(num))#提示每一页的第几条记录爬取失败,上面的11条内容中有一个确实就会导致整篇文章爬取失败
continue
print(item)
yield item
start_requests的方法是用于拼接不同页码的URL然后进行发送请求。
parse的方法则是用于编写爬取信息的代码。
在这里我们可以看到一个li标签是对应一篇文章的全部内容的,所以我们可以设置这个li标签的XPath路径为for循环的列表,这样我们编写for循环之后就会循环爬取每一篇文章字段里面的内容。
for循环里面内容的Xpath路径最好是相对路径,就是相对于刚刚li标签的路径。
最后这个yield item
是将item的数据返回给通道(pipelines),下面我会讲这个pipelines的作用。
这里主要是编写将数据存入MySQL的代码,先上代码:
import pymysql
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
class QunartravelPipeline:
def process_item(self, item, spider):
return item
class QunartravelMysqlPipeline:
def process_item(self,item,spider):
sql_insert = "insert into qunar values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
self.cur.execute(sql_insert,[item["Title"],item["TravelLink"],item["Date"],item["Days"],item["Photo_Nums"],item["Fee"],item["People"],item["Places"],item["Views"],item["Love"],item["Comment"]])
self.db.commit()
return item
def open_spider(self,spider):
self.db = pymysql.connect(host="127.0.0.1",user="root",password="123456",port=3306,database="qunarnet",charset="utf8")
self.cur = self.db.cursor()
def close_spider(self,spider):
self.db.close()
self.cur.close()
process_item的方法主要是编写SQL语句,并且将刚刚Qunar.py传过来的数据通过SQL语句提交到数据库中。
而open_spider则是负责连接MySQL数据库,close_spider最后就是关闭数据库连接和关闭游标。
这里我们要注意一下的就是,MySQL和MongoDB不一样的是,MySQL需要事先创建好数据库和表,还有设置好表里的字段等等,不然会导致报错!!!
最后稍微设置一下就大功告成了!!!先上代码:
第一
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
第二,请求头
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36',
}
第三,pipelines的设置,第二行设置的数字一定要比第一行小,不然不会存入MySQL!!!
ITEM_PIPELINES = {
'QunarTravel.pipelines.QunartravelPipeline': 300,
'QunarTravel.pipelines.QunartravelMysqlPipeline': 200,
}
最后我们只需要在命令行中输入scrapy crawl Qunar
回车!
就可以通过我们的Navicat中看到我们爬取的内容啦!!!
同时,我们也可以在命令行中输入scrapy crawl Qunar -o Qunar.csv
就可以自动生成csv格式的文件,同时也可以生成json,xml格式的文件哦。
到这里我们的教程就结束了,如果其中有什么问题欢迎在评论区交流,欢迎多多指教!!!