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