简单的Scrapy数据爬虫

数据爬取展示:

环境准备:

  • Python 3+版本
  • Pycharm(可以没有)
  • Scrapy环境

Scrapy环境安装问题

//cmd中输入即可(一般在windows系统都会出问题)
pip install scrapy

Scrapy环境安装问题

  • 缺少Scrapy的依赖包问题

    一般缺少parsel, w3lib, pyOpenSSL,cryptography的whl文件,按顺序进行pip install XXX。如果在线安装不了,去官网进行下载。离线进行安装 pip install XXXX.whl

  • pip提醒没有此命令

    方法一:进入Python安装目录中,找到Scripts文件夹中进行输入cmd命令行。(指标不治本)

在电脑中环境变量中path中配置Scripts路径(治本之策)

  • pip提醒升级问题

    解决方法:

    python -m pip install -U --force-reinstall pip
    

    python -m pip install --upgrade pip仍然更新pip版本失败,用easy_install命令解决问题

Xpath基础

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。

花个五分钟在W3C上看看就知道了,不是很难。

表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性
方便在网页上进行XPath的编写,Google浏览器有个很好的插件——XPath Helper

网盘地址:https://pan.baidu.com/s/16ourySoo45BpbfDRjUT32w
提取码:aps7

直接利用这个插件在网页端可以看到XPath获取的信息

eg:(当当网——获取图书信息XPath)//div[@id="search_nature_rg"]/ul/li/p[@class="detail"]

Scrapy代码编写

在新建的文件夹下,cmd命令中输入

scrapy startproject XXXSpider

一般的命名规范是XXXSpider,文件名+Spider

创建爬虫

scrapy genspider 爬虫名字 网站域名

在cfg文件目录下执行命

<u>爬虫名字不能和项目名字重名</u>

网站域名:baidu.com google.com

Setting文件的修改部分:

1、ROBOTSTXT_OBEY规则设置为False(不用遵守网站的robot文件,如果遵守可能什么都爬不下来)

2、添加User-Agent(Setting文件DEFAULT_REQUEST_HEADERS取消注释)

'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36'

依照以上两步操作,可以得到的文件目录如下:

在新增的爬虫文件中编写代码:(爬取的是博雅地名网)

import scrapy


class GazetterSpider(scrapy.Spider):
    name = 'gazetter'
    allowed_domains = ['tcmap.com.cn']
    start_urls = ['http://www.tcmap.com.cn/jiangsu/']

    //未遍历
    def parse(self, response):
        # selectors = response.xpath('');
        city_name = response.xpath('//tr[@bgcolor="#f8f8f8"]/td/strong/a/text()').get()
        population = response.xpath('//tr[@bgcolor="#f8f8f8"]/td[2]/text()').get()
        area = response.xpath('//tr[@bgcolor="#f8f8f8"]/td[3]/text()').get()
        code = response.xpath('//tr[@bgcolor="#f8f8f8"]/td[4]/text()').get()
        administrative_division = response.xpath('//tr[@bgcolor="#f8f8f8"]/td[6]/a/text()').get()
        detail = response.xpath('//td[@valign="top"][2]/text()').get()

        items = {
            'cityName': city_name,
            'population': population,
            'area': area,
            'code': code,
            'administrative_division': administrative_division,
            'detail': detail
        }

        yield items

运行程序:

scrapy crawl XXXX -o xxx.json

Scrapy输出文件有四种格式——.json .csv等

编码问题

在Setting文件中添加

FEED_EXPORT_ENCODING='UTF-8'

否则输出的文件是Unicode格式,需要转码。

posted @ 2020-02-15 21:52  宥_XWX  阅读(2)  评论(0编辑  收藏  举报  来源