Scrapy+MySQL爬取去哪儿旅游【超详细!!!】
基于Python语言,利用Scrapy框架爬取信息,并持久化存储在MySQL
文章目录
Scrapy+MySQL爬取去哪儿旅游【超详细!!!】一、初始化Scrapy框架二、编写代码1.items.py2.spiders/Qunar.py3.pipelines.py4.setting.py运行程序一、初始化Scrapy框架
打开cmd或者powershell,然后输入scrapy startproject
+你的项目名
然后 cd 到你项目名的下级目录之后再输入以下命令,scrapy genspider
+名字+你要爬取网站的域名【!!!注意一定是域名,而不是URL】
到这里之后,我们的Scrapy就初始化成功了!
二、编写代码
1.items.py
定义你待会需要爬取的字段,代码如下:
import scrapyclass 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:评论数
2.spiders/Qunar.py
这个文件在spiders的文件夹下的py文件,用于编写爬取网站信息的代码,我这里用的简单的xpath即可获取网页对应字段信息,代码如下:
import scrapyfrom QunarTravel.items import QunartravelItemclass QunarSpider(scrapy.Spider):name = 'Qunar'allowed_domains = ['']start_urls = ['/']urls = "/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条内容中有一个确实就会导致整篇文章爬取失败continueprint(item)yield item
start_requests的方法是用于拼接不同页码的URL然后进行发送请求。
parse的方法则是用于编写爬取信息的代码。
在这里我们可以看到一个li标签是对应一篇文章的全部内容的,所以我们可以设置这个li标签的XPath路径为for循环的列表,这样我们编写for循环之后就会循环爬取每一篇文章字段里面的内容。
for循环里面内容的Xpath路径最好是相对路径,就是相对于刚刚li标签的路径。
最后这个yield item
是将item的数据返回给通道(pipelines),下面我会讲这个pipelines的作用。
3.pipelines.py
这里主要是编写将数据存入MySQL的代码,先上代码:
import pymysql# useful for handling different item types with a single interfacefrom itemadapter import ItemAdapterclass QunartravelPipeline:def process_item(self, item, spider):return itemclass 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"]])mit()return itemdef 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需要事先创建好数据库和表,还有设置好表里的字段等等,不然会导致报错!!!
4.setting.py
最后稍微设置一下就大功告成了!!!先上代码:
第一
# Obey robots.txt rulesROBOTSTXT_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格式的文件哦。
到这里我们的教程就结束了,如果其中有什么问题欢迎在评论区交流,欢迎多多指教!!!