Scrapy+MySQL爬取去哪儿网

Scrapy+MySQL爬取去哪儿旅游【超详细!!!】

基于Python语言,利用Scrapy框架爬取信息,并持久化存储在MySQL


文章目录

  • Scrapy+MySQL爬取去哪儿旅游【超详细!!!】
  • 一、初始化Scrapy框架
  • 二、编写代码
    • 1.items.py
    • 2.spiders/Qunar.py
    • 3.pipelines.py
    • 4.setting.py
  • 运行程序


一、初始化Scrapy框架

打开cmd或者powershell,然后输入scrapy startproject+你的项目名
Scrapy+MySQL爬取去哪儿网_第1张图片
然后 cd 到你项目名的下级目录之后再输入以下命令,scrapy genspider+名字+你要爬取网站的域名【!!!注意一定是域名,而不是URL

在这里插入图片描述
到这里之后,我们的Scrapy就初始化成功了!

二、编写代码

1.items.py

定义你待会需要爬取的字段,代码如下:

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:评论数

2.spiders/Qunar.py

这个文件在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的方法则是用于编写爬取信息的代码。
Scrapy+MySQL爬取去哪儿网_第2张图片
在这里我们可以看到一个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 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需要事先创建好数据库和表,还有设置好表里的字段等等,不然会导致报错!!!

4.setting.py

最后稍微设置一下就大功告成了!!!先上代码:

第一

# 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+MySQL爬取去哪儿网_第3张图片
同时,我们也可以在命令行中输入scrapy crawl Qunar -o Qunar.csv就可以自动生成csv格式的文件,同时也可以生成json,xml格式的文件哦。
Scrapy+MySQL爬取去哪儿网_第4张图片
到这里我们的教程就结束了,如果其中有什么问题欢迎在评论区交流,欢迎多多指教!!!

你可能感兴趣的:(笔记,mysql,python,爬虫,xpath)