题记

之前对爬虫只是概念了解多,实战少。知道网上流行的有号称免费的八爪鱼等(实际导出数据收费)。
大致知道,所有爬虫要实现爬取网页信息,需要定义正则匹配规则。
这次,项目紧急,才知道“书到用时方恨少”,有限的理论知识是远远不够的。
首先,Google搜索了不同语言实现的开源爬虫,C++、Java、Python、Ruby等。由于C++写的过于庞大,Java代码不太熟。
Python虽也不熟悉,但看起来不费劲,并且,Python在爬虫领域有很大优势,值得深入研究。
其次,对比选型Python爬虫开源实现,主要包括:Scrapy、PyRailgun等。
最后,定选型。对比国内写的PyRailgun和Scrapy,不论从易用性、Git关注度、广泛性。Scrapy都有明显优势,研究的人非常多。
因此,本文从Scrapy爬取makepolo企业数据说起。

一、Scrapy爬虫使用概括步骤如下

1、创建新的Scrapy工程;
2、定义需要提取的Items;
3、写爬虫Spider用于爬取设定的站点,提取Items;
4、写Item Pipeline(管道),用来存储提取的Items。

二、Scrapy爬虫使用详解

前提:

1)爬虫目标网站:http://company.makepolo.com/shandong/
2)待爬取内容:以列表形式呈现的公司名称。
3)设备:centos 6.8
4)安装Scrapy参考步骤(目前最好用、快捷版本):
https://www.douban.com/group/topic/51645204/

第1步:创建马可波罗网站爬虫工程。

[root@yang scrapy_testing]# scrapy startproject scrapy_makepolo
New Scrapy project ‘scrapy_makepolo’, using template directory ‘/usr/local/lib/python2.7/site-packages/scrapy/templates/project’, created in:
/home/yang/spider_ycy/scrapy_testing/scrapy_makepolo

You can start your first spider with:
cd scrapy_makepolo
scrapy genspider example example.com

以上内容是提示信息,也就是说创建完毕以后,会形成如下树结构的工程路径:
[root@yang scrapy_testing]# tree scrapy_makepolo/
scrapy_makepolo/
├── scrapy.cfg ‘#工程的配置文件
└── scrapy_makepolo ‘#工程的Python模型,需要在此处导入代码
├── init.py
├── init.pyc
├── init.pyo
├── items.py ‘#工程 Items文件
├── pipelines.py ‘#工程 管道文件
├── settings.py ‘#工程 配置文件
├── settings.pyc
└── spiders ‘#放置爬虫的路径
├── example.py
├── init.py
├── init.pyc
└── init.pyo

第2步:定义你的Item

在items.py文件里定义在抓取网页内容中抽象出来的数据结构的定义,由于这里需要公司名称一个字段,所以,定义的Item结构如下:
[root@laoyang scrapy_makepolo]# cat items.py

'# -*- coding: utf-8 -*-# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.htmlfrom scrapy import Item,Fieldclass ScrapyMakepoloItem(Item):# define the fields for your item here like:# name = scrapy.Field()companyName = Field() #公司名称pass
You have new mail in /var/spool/mail/root

第3步:定义爬虫规则等

1.Spiders是定义的类,scrapy用于爬取指定域名或者域名组信息。
2.需要定义用于下载的初始化URL列表,需要定义跟踪列表和解析页面内容以提取items的规则。
3.为了创建Spider,你需要定义scrapy.Spider子类,并需要定义如下的一些属性值:
1)name:用于标识Spider。该名称必须确保唯一性。
2)start_urls:爬虫需要爬取的起点Urls列表。
3)parse()方法:Spider方法,每个页面下载的Response对象是该方法的唯一参数。
该方法作用:解析response数据,并提取爬取的数据。
路径如下:

/home/yangcy/spider_ycy/scrapy_testing/scrapy_makepolo/scrapy_makepolo/spiders
[root@laoyang spiders]# ls -al
总用量 24
drwxr-xr-x 2 root root 4096 9月 8 14:20 .
drwxr-xr-x 3 root root 4096 9月 8 14:35 ..
-rw-r--r-- 1 root root 240 9月 8 14:20 example.py
-rw-r--r-- 1 root root 161 9月 7 15:50 __init__.py
-rw-r--r-- 1 root root 177 9月 8 14:20 __init__.pyc
-rw-r--r-- 1 root root 177 9月 7 16:04 __init__.pyo

将example.py改名为 ScrapyMakepolo.py,并做如下的规则定义。

[root@laoyang spiders]# cat ScrapyMakepolo.py
# -*- coding: utf-8 -*-from scrapy.spiders import Spider, Rule
from scrapy.selector import Selector
from scrapy_makepolo.items import ScrapyMakepoloItem
from scrapy.linkextractors import LinkExtractor
import re
from scrapy.spiders import CrawlSpiderclass ScrapyMakepoloSpider(CrawlSpider):name = "MakepoloSpider"allowed_domains = ["company.makepolo.com"]start_urls = ["http://company.makepolo.com/shandong/1",]rules = (Rule(LinkExtractor(allow=('shandong/([\d]+)', ),),callback='parse_item',follow=True),)def parse_item(self, response):sel = response.selectorposts = sel.xpath('//div[@class="colist"]/div[@class="colist_item"]')items = []for p in posts:item = ScrapyMakepoloItem()companyName = p.xpath('h2[@class="colist_item_title"]/a/text()').extract_first()item["companyName"] = (companyName is not None and [companyName.encode("utf-8")] or [""])[0]items.append(item)return items

第4步: 写Item Pipeline(管道),用来存储提取的Items。

将结果输出到item.json文件中。

[root@laoyang scrapy_makepolo]# cat pipelines.py
# -*- coding: utf-8 -*-# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.htmlimport jsonclass ScrapyMakepoloPipeline(object):def __init__(self):self.file = open("item.json", "w+")def process_item(self, item, spider):record = json.dumps(dict(item), ensure_ascii=False)+"\n"self.file.write(record)return item

第5步:修改配置setting.py.

主要修改: ITEM_PIPELINES 为pipelines.py 中定义的管道接口类ScrapyMakepoloPipeline。

[root@laoyang scrapy_makepolo]# cat settings.py
# -*- coding: utf-8 -*-# Scrapy settings for scrapy_makepolo project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
# http://doc.scrapy.org/en/latest/topics/settings.html
# http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
# http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.htmlBOT_NAME = 'scrapy_makepolo'SPIDER_MODULES = ['scrapy_makepolo.spiders']
NEWSPIDER_MODULE = 'scrapy_makepolo.spiders'# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {'scrapy_makepolo.pipelines.ScrapyMakepoloPipeline': 1,
}

至此,所有配置完毕。

第6步:执行。

scrapy crawl MakepoloSpider
其中:
MakepoloSpider为ScrapyMakepolo.py中的name定义。

执行结果如下所示:

[root@laoyang scrapy_makepolo]# tail -f item.json
{"companyName": "章丘市宇龙机械有限公司"}
{"companyName": "济南松岳机器有限责任公司"}
{"companyName": "山东双一集团销售部"}
{"companyName": "山东景盛泉酒业"}
{"companyName": "郓城皮家烧鸡有限公司"}
{"companyName": "胶州市煜德手机通讯服务部"}
{"companyName": "宁津县天福建筑新材料有限公司"}
{"companyName": "聊城市建兴金属材料有限公司"}
{"companyName": "山东益母草有限公司"}
..........

去重后结果数:

[root@laoyang scrapy_cnblogs-master]# cat sd_mkbl_uniq.txt | wc -l
9521

三、scrapy爬取马可波罗网站思路详解:

步骤1:进入到马可波罗山东企业首页:http://company.makepolo.com/shandong/

步骤2:查看其页面结构,知道其支持通过下一页按钮进入下一页。

第1页链接:http://company.makepolo.com/shandong/1
第2页链接:http://company.makepolo.com/shandong/2
……
第1000页链接:http://company.makepolo.com/shandong/1000

由此看出网站以序号作为参数来表示页数,这样看来爬虫的规则就比较简单实现。

步骤3:定义爬虫规则。

‘shandong/([\d]+)’ ,这个就是爬虫的规则,数字为对应数字的页面,这样无论有多少页都可以通过遍历规则遍历到。
1)如果页面数量很少时:可以在start_urls列表中,将要爬取的页面都列出来,
2)如果页面数量很多时:要继承CrawlSpider爬虫类,使用Spider就不行了。(该问题排查了30分钟以上,才解决)
在规则定义(rules)时,如果要对爬取的网页进行处理,而不是简单的需要Url列表堆砌。
这时,需要定义一个回调函数,在爬取到符合条件的网页时调用,并且设置follow=Ture,定义如下:

rules = (Rule(LinkExtractor(allow=('shandong/([\d]+)', ),),callback='parse_item',follow=True),)

四、小结

想融汇贯通Scrapy进行网络数据分析,个人感觉:网页数据爬取正则标示,xpath解析非常重要。这也是我接下来要深入研究的重点。
也想进一步就其他网站做进一步深入爬取、分析。

参考

[1]http://doc.scrapy.org/en/latest/intro/tutorial.html
http://www.cnblogs.com/rwxwsblog/p/4557123.html
[2]学习python:https://learnpythonthehardway.org/book/
[3]http://www.pycoding.com/2016/03/14/scrapy-04.html

2016-9-9 pm23:03 思于家中床前

作者:铭毅天下
转载请标明出处,原文地址:
http://blog.csdn.net/laoyang360/article/details/52491147
如果感觉本文对您有帮助,请点击‘顶’支持一下,您的支持是我坚持写作最大的动力,谢谢!

Scrapy爬取makepolo网站数据深入详解相关推荐

  1. python爬取动态网页_python爬取动态网页数据,详解

    原理:动态网页,即用js代码实现动态加载数据,就是可以根据用户的行为,自动访问服务器请求数据,重点就是:请求数据,那么怎么用python获取这个数据了? 浏览器请求数据方式:浏览器向服务器的api(例 ...

  2. Python 爬虫学习笔记(十(2))scrapy爬取图书电商实战详解

    目标是爬取某一系列图书的信息,例如名称.价格.图片等. 一.创建scrapy项目 在PyCharm终端依次输入: scrapy startproject dangdang cd dangdang\da ...

  3. 抓取网站数据入库详解,附图文

    抓取网站数据入库详解,附图文 一. 分析需求 1.1 需求分析 刚好有这样一个需求,去抓取下方网站的页面全部数据,并存入MySQL数据库. 这个页面为: 爬取页面 年月日选择 出生于几点,性别: 男或 ...

  4. python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析

    这篇文章主要介绍了python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析的实例,帮助大家更好的理解和学习使用python.感兴趣的朋友可以了解下 一.环境准备 python3.8.3 ...

  5. scrapy爬取酒店评论数据

    scrapy爬取酒店评论数据 代码 here:GitHub:scrapy_hotel_review 采用scrapy爬取酒店评论数据. 总共有28W条记录. 做某NLP任务,需要一些hotel rev ...

  6. python爬取12306_Python爬取12306车次信息代码详解

    详情查看下面的代码: 如果被识别就要添加一个cookie如果没有被识别的话就要一个user-agent就好了.如果出现乱码就设置编码格式为utf-8 #静态的数据一般在elements中(复制文字到s ...

  7. python爬取虎扑评论_python爬虫系列Selenium定向爬取虎扑篮球图片详解

    前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员 ...

  8. Python爬虫教程:Python爬取京东商城商品大图详解

    Python爬取京东商城商品大图详解 做为一个爬虫初学者,在做爬取网址图片的练习中以京东网为例爬取商品大图并保存在相应的文件夹 1.导入模块 import urllib.request import ...

  9. 四十一、完成scrapy爬取官方网站新房的数据

    @Author:Runsen 文章目录 前言 分析网页 新建项目 加请求头 搞定item 首页调试 详情页调试 保存json 前言 在前几天,接到一个大学生的作业的爬虫单子,要求采用scrapy爬取链 ...

  10. 怎样使用Scrapy爬取NVD网站上的数据

    关于Scrapy的使用,我已经写过很多篇博客了: Python爬虫框架Scrapy的基本使用方法(以爬取加密货币GitHub链接为例)_蛐蛐蛐的博客-CSDN博客 使用Python爬虫框架Scrapy ...

最新文章

  1. 正式压力测试:locust进阶,超简单搭建生产级locust集群
  2. 2014 Super Training #8 C An Easy Game --DP
  3. oracle数据库修改写入状态,【学习笔记】Oracle oradebug 使用oradebug修改数据库SCN方法案例...
  4. com.alibaba.dubbo.rpc.RpcException: Forbid consumer 192.168.184.1 access service com.foreveross.syst
  5. hdoj1789:Doing Homework again (贪心)
  6. 标准模板库之双向循环链表的内部关系
  7. 四川大学计算机软件技术基础,四川大学《计算机软件技术基础》复习题2及答案#.doc...
  8. 【Elasticsearch】实用BM25 -第1部分: shard 如何影响Elasticsearch中的相关性评分
  9. Python语言编程规范与优化建议
  10. 排序专题之C++中的sort函数调用
  11. 1423 poj Big Number 公式题
  12. 据说:一个线程性能相当于30%核心
  13. 快速查找文件的神器Listary
  14. VsCode之在vue中HTML代码使用自动补全插件
  15. 普通话水平测试用朗读作品60篇-(练习版)
  16. javascript开发简易画板
  17. 失眠睡不着觉怎么办?这些助眠好物帮助你走出失眠
  18. Blend for Visual Studio 让XAML也可以像WinForm一样可视化设计,Blend 与Studio的区别
  19. Day02 Jinja2模板引擎Bootstrap
  20. Sophie Mapuis

热门文章

  1. pandas中category类型的数据处理
  2. Adobe Photoshop CC制作简单的个人Logo
  3. CWnd与CDialog-DoModal与ShowWindow区别
  4. 文件系统FastDFS和阿里云OSS
  5. 经济学论文素材之美国浮动汇率制度
  6. 【图示】AppleID绑定支付宝的方法
  7. 行列式与矩阵相关与应用
  8. 手机共享计算机网络连接,如何将手机wifi网络通过USB共享给电脑?教您共享方法...
  9. itext7接口和类概述以及pdf常见操作
  10. SpringBoot 生成带水印pdf | 中文字体问题