从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。