【Scrapy学习心得】爬虫实战一(入门案例)

【Scrapy学习心得】爬虫实战一(入门案例)

声明:仅供技术交流,请勿用于非法用途,如有其它非法用途造成损失,和本博客无关

爬取的网站:东莞阳光网问政平台中的投诉页面 点击跳转

一、配置环境

  • python3.7
  • pycharm
  • Scrapy1.7.3
  • win10
  • pymysql

二、准备工作

  • 在cmd命令行中进入需要创建项目的目录运行scrapy startproject tutorial
  • 创建成功后继续执行cd yg
  • 然后执行scrapy genspider yg sun0769.com
  • 最后在spider文件夹下可以看到刚创建的yg.py爬虫文件

三、分析网页


可以看到,这是一个很简单的网页而已,非常容易爬取数据,在这个页面我只想要它的标题以及标题对应详情页面的url和时间,然后随便进入其中一个标题内容的详情页面,如下:

然后这个详情页面我只想要它的文本内容,即提问的这个人所写的具体信息。不过可以发现有一些会有上传图片,例如:

那么我也想把它的图片拿下来,这里我只把图片的url爬取下来了

所以总共我要爬取的内容有:

  1. 一开始的页面里的标题
  2. 标题详情页面的url地址
  3. 时间
  4. 详情页面里的图片url地址
  5. 详情页面里的内容

在此,我们在yg项目目录下的item.py文件里可以先定义如下:

import scrapy

class TutorialItem(scrapy.Item):
    title = scrapy.Field()  #标题
    url = scrapy.Field()    #标题详情页面url
    date = scrapy.Field()   #时间
    img_url = scrapy.Field() #图片url
    content = scrapy.Field() #内容

可以说item.py文件在scrpy框架爬虫中是最简单好写的一个,没有之一,并且我感觉它是可有可无的,因为你可以在爬虫文件中自己定义一个item变量字典用来保存爬取的数据,都是一样的结果,只是用item.py会显的更加装13专业一点,哈哈

查找元素的那些操作我就不放上来了,因为没什么难度的,会来学scrapy框架的同学肯定是跟我一样那些什么requests啊,urllib啊,selenium啊等等都是用腻了才来的,是吧

四、爬取数据

下面直接放上yg.py的代码:

# -*- coding: utf-8 -*-
import scrapy
from tutorial.items import TutorialItem  #需要导入item文件中的创建的类


class YgSpider(scrapy.Spider):
    name = 'yg'
    allowed_domains = ['sun0769.com']
    start_urls = ['http://d.wz.sun0769.com/index.php/question/questionType?type=4']

    def parse(self, response):
        tr_list=response.xpath('//div[@class="greyframe"]/table[2]/tr/td/table/tr')
        for tr in tr_list:
            item=TutorialItem()
            item['title']=tr.css('a::attr(title)').get()
            item['url']=tr.css('a::attr(href)')[1].get()
            item['date']=tr.xpath('./td[last()]/text()').get()
            #下面是发送去详情页面的请求
            yield scrapy.Request(
                item['url'],
                callback=self.parse_detail,  #让返回的response交给这个函数处理,注意:不要带上括号
                meta={'item':item}  #并且把上面爬到的标题等内容一起传过去
            )
        #下面是进行翻页的操作
        next_page=response.xpath('//a[text()=">"]/@href').get()
        if next_page is not None:
            yield scrapy.Request(next_page,callback=self.parse)

    def parse_detail(self,response):
        item=response.meta['item'] #接受传进来的item
        item['content']=response.xpath('//td[@class="txt16_3"]/text()').getall()
        item['img_url']=response.xpath('//td[@class="txt16_3"]//img/@src').getall()
        #下面处理图片url
        item['img_url']=['http://wz.sun0769.com' + i for i in item['img_url']]
        item['img_url']=''.join(i for i in item['img_url'])
        yield item  #会传给pipeline.py进行保存数据的操作

五、保存数据

保存数据是交给pipeline.py文件进行操作的

这里我把数据保存到了mysql数据库中,如果没有安装pymysql的,可以在cmd命令下执行pip install pymysql来安装一下即可
然后pipeline.py文件的代码如下:

# -*- coding: utf-8 -*-
import pymysql

class TutorialPipeline(object):
	#爬虫开始时运行的函数
    def open_spider(self,spider):
        print('爬虫开始...')
        conn = pymysql.connect(host='localhost', user='youruser', password='yourpassword', database='yourdatabase', charset='utf8')
        cursor = conn.cursor()
	
	 #接收传入的item,来进行数据的存储
    def process_item(self, item, spider):
        if spider.name == 'yg':
            item['content']=self.process_content(item['content'])
            title=item['title']
            url=item['url']
            date=item['date']
            content=item['content']
            img_url=item['img_url']
            sql='insert into yg(title,url,date,content,img_url) values(%s,%s,%s,%s,%s)'
            cursor.execute(sql, [title,url,date,content,img_url])
            conn.commit()
            
	#因为传进来的content需要清洗处理一下,因此定义下面的函数
    def process_content(self,content):
        content=[re.sub(r"\xa0|\s","",i) for i in content]
        content=[i for i in content if len(i)>0]
        content=[i.strip() for i in content]
        content=''.join(i for i in content)
        # content=''.join(content).strip()
        return content
	
	#爬虫结束后会运行的函数
    def close_spider(self,spider):
        print('爬虫结束...')
        cursor.close()
        conn.close()

现在我们的爬虫大致已经是写完了,不过我还要修改一下setting.py文件的一些设置,需要增加的语句有:

LOG_LEVEL='WARNING' #设置日志输出级别
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'  #设置请求头
ROBOTSTXT_OBEY = False  #把这个设置成False,就不会去请求网页的robots.txt,因为不改为False的话,scrapy就会去访问该网站的robots.txt协议,如果网站没有这个协议,那么它就不会去访问该网站,就会跳过,进而爬不到数据
ITEM_PIPELINES = {
   'tutorial.pipelines.TutorialPipeline': 300,  #打开刚刚设置的pipeline.py
}

最后在cmd中先进入到这个项目的根目录下,即有scrapy.cfg文件的目录下,然后输入并运行scrapy crawl yg,最后静静等待就行了

打开数据库你会看到:

写在最后

到现在为止,我接触python爬虫也差不多有半年了吧,不是接触,是开始学,因为之前都没有爬取过数据,都在做数据分析的工作。然后呢,一开始我就从图书馆借了几本python爬虫的书来看,都是一些比较基础的入门级别的书,当时还有课,只是在空闲的时间里学,偶尔在一些比较无聊的课的时候会带过去看,也不知道为什么,看着看着就觉得很有趣,就会去敲敲代码自己爬一下玩玩,爬着爬着就好像懂得了一些爬虫的原理吧,于是趁着放暑假,就从图书馆又借了几本发布时间不久的比较新的系统一点的书,回到家就把那几本书给看完了,并且是一个案例都不放过的那种,从一开始的urllibrequests,再到selenium,全部都学完了,也不是学完吧,就大致都知道怎么用,也可以很好的结合在一起使用,现在是运用自如。最近呢,想了想,好像还差点什么东西,是什么呢,毫无疑问就是框架啊,到现在我一个爬虫的框架都没有学过,于是就开始学非常非常热门的scrapy了,也学了有一段时间了,没算错的话应该有3个星期了。然后呢,学到现在,大概是知道了scrapy的一些原理,以及怎么使用它了,也知道了它的一些优点和缺点。又因为最近时间有点儿充裕,而且朋友也问我为什么不写写博客之类的啊,记录一下也好啊。于是乎,就有了这一篇文章。后续我会继续写scrapy的一些爬虫案例,并且记录一下当下的一些心得体会,与大家分享一下。

发布了13 篇原创文章 · 获赞 43 · 访问量 9086

猜你喜欢

转载自blog.csdn.net/sinat_39629323/article/details/101674609