从0开始基于python3用scrapy爬取数据

写在开头:

 博主刚开始爬取数据的时候选中的kanzhun网,结果被封了ip -_- 。查看了kanzhun网的robots协议(http://www.kanzhun.com/robots.txt),发现它们非常严格,就是这个不让爬那个也不让爬。于是想起了参加儿博会的时候被安利的一个母婴电商app,一看他们连robots协议都没有,想必是程序员都去赶功能去了,应该是我们都喜闻乐见的网站。于是进去看了看...一共采集到了3000多个商品,发现大部分都是0-100元这个区间,还是挺亲民的价格,想了解



的可以联系我:)


从0开始基于python3用scrapy爬取数据
 

摘要:

本文主要介绍0基础从python3的安装到使用scrapy框架抓取某母婴电商的数据并简单分析。主要包括以下内容: 

 
从0开始基于python3用scrapy爬取数据

第一爬:官网

第一次爬取数据强烈推荐内网系统,免得一个代理问题就让激情退却了:

安装python3

下载地址:https://www.python.org/downloads/

查看安装版本以验证安装成功:

$:python -V

注意:

1)python3和python2的差别非常大,大家在google的时候要看清楚是针对python2还是python3的。

比如在python2中,print是这样的 

print "hello world"

而在python3中,print是函数要加上括号,变成了:

print("hello world")

2) python有很多多多多的库,可以通过pip install命令下载,例如下载我们前面画的那个柱状图的库:

pip install matplotlib

   在python2.7和python3.6之后,pip已经集成到python安装包里面了,不用再单独下载。

3)如果是Mac用户,系统已经自带了python2.7,博主不敢随便升级,于是另外安装了python3。并不像网上很多老帖子写的需要装environment来切换两个python版本(猜测是针对windows用户的)。系统自带的python用python启动,而python3用命令python3启动,pip也是一样,有pip命令和pip3命令。就像是两个应用一样非常方便。

Zhuos-MacBook-Pro:demo jo$ python -V
Python 2.7.13
Zhuos-MacBook-Pro:demo jo$ python3 -V
Python 3.6.1

     Windows用户如果要装两个版本...装好了来跟博主share下经验教训。

4)本文之后所有的代码示例都是基于python3的。

编辑器安装:

推荐使用pycharm,地址: https://www.jetbrains.com/pycharm/download/

爬取官网

第一个爬虫代码,我们暂时不考虑url的相对路径问题,也不考虑公司代理问题等...下面的代码应该是最简单的了,再简单就是伪代码了。

import re
import urllib
import urllib.request
from collections import deque

url = "http://www.you_compay_home_page.com"

queue = deque()
visited = set()
total_count = 1
queue.append(url)

while queue:
    url = queue.popleft()
    visited |= {url}
    print("正在抓取第 " + str(total_count) + " 个, " + url)
    total_count += 1
    urllop = urllib.request.urlopen(url, timeout=1)
    if "html" not in urllop.getheader('Content-Type'):
        print(urllop + " 不是html页面,忽略!")
        continue
    try:
        data = urllop.read().decode("utf-8")
    except Exception as e:
        print(e)
        continue
    count_per_page = 0
    
    linkre = re.compile('href="(.+?)"')
    for x in linkre.findall(data):
        if 'https://www.you_compay_home_page.com/' in x and x not in visited:
            count_per_page += 1
            queue.append(x) #注意调试的时候注释本行,以免对服务器造成压力
            print("加入待爬页面:" + x)
    print("本页面共加入待爬页面:" + str(count_per_page))

 解释:

line1~4

     导入我们需要的依赖库:re是正则表达式,顾名思义urllib与urllib.request是针对url,deque是针对队列的.

line6~11

     url:爬虫的入口;queue:存放要爬取的页面;visited:存放已经爬取过的页面,防止重复爬取。

   1)url,queue,visited,total_count都是对象引用。

   2)  python不用像java一样需要定义引用的类型,每个引用都知道自己指向的是什么类型的对象。

   3)  python中没有原子数据类型,都是对象,例如line17,total_count也是一个int型的对象。

line13:有没花括号了,取而代之的是冒号+缩进,例如if, while, try...

line18: urlopen这个方法只有一个url是必填参数,timeout是有默认值的参数,但是我们传入了自定义的值。

urllop = urllib.request.urlopen(url, timeout=1) 

看看这个方法的定义:

def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
            *, cafile=None, capath=None, cadefault=False, context=None):
第一个url是必填参数,后面的data,timeout,cafile等是默认参数。我们调用该方法的时候,只提供了必选参数url和默认参数timeout。

相关推荐