python爬虫入门需要哪些基础

Python012

python爬虫入门需要哪些基础,第1张

现在之所以有这么多的小伙伴热衷于爬虫技术,无外乎是因为爬虫可以帮我们做很多事情,比如搜索引擎、采集数据、广告过滤等,以Python为例,Python爬虫可以用于数据分析,在数据抓取方面发挥巨大的作用。

但是这并不意味着单纯掌握一门Python语言,就对爬虫技术触类旁通,要学习的知识和规范还有喜很多,包括但不仅限于HTML 知识、HTTP/HTTPS 协议的基本知识、正则表达式、数据库知识,常用抓包工具的使用、爬虫框架的使用等。而且涉及到大规模爬虫,还需要了解分布式的概念、消息队列、常用的数据结构和算法、缓存,甚至还包括机器学习的应用,大规模的系统背后都是靠很多技术来支撑的。

零基础如何学爬虫技术?对于迷茫的初学者来说,爬虫技术起步学习阶段,最重要的就是明确学习路径,找准学习方法,唯有如此,在良好的学习习惯督促下,后期的系统学习才会事半功倍,游刃有余。

用Python写爬虫,首先需要会Python,把基础语法搞懂,知道怎么使用函数、类和常用的数据结构如list、dict中的常用方法就算基本入门。作为入门爬虫来说,需要了解 HTTP协议的基本原理,虽然 HTTP 规范用一本书都写不完,但深入的内容可以放以后慢慢去看,理论与实践相结合后期学习才会越来越轻松。关于爬虫学习的具体步骤,我大概罗列了以下几大部分,大家可以参考:

网络爬虫基础知识:

爬虫的定义

爬虫的作用

Http协议

基本抓包工具(Fiddler)使用

Python模块实现爬虫:

urllib3、requests、lxml、bs4 模块大体作用讲解

使用requests模块 get 方式获取静态页面数据

使用requests模块 post 方式获取静态页面数据

使用requests模块获取 ajax 动态页面数据

使用requests模块模拟登录网站

使用Tesseract进行验证码识别

Scrapy框架与Scrapy-Redis:

Scrapy 爬虫框架大体说明

Scrapy spider 类

Scrapy item 及 pipeline

Scrapy CrawlSpider 类

通过Scrapy-Redis 实现分布式爬虫

借助自动化测试工具和浏览器爬取数据:

Selenium + PhantomJS 说明及简单实例

Selenium + PhantomJS 实现网站登录

Selenium + PhantomJS 实现动态页面数据爬取

爬虫项目实战:

分布式爬虫+ Elasticsearch 打造搜索引擎

有一个py3kcap是pycap的封装版本,可以用于python 3版本。

给你一个使用的示例代码:

#!/usr/bin/env python3.2

import ctypes,sys

from ctypes.util import find_library

#pcap = ctypes.cdll.LoadLibrary("libpcap.so")

pcap = None

if(find_library("libpcap") == None):

    print("We are here!")

    pcap = ctypes.cdll.LoadLibrary("libpcap.so")

else:

    pcap = ctypes.cdll.LoadLibrary(find_library("libpcap"))

# required so we can access bpf_program->bf_insns

"""

struct bpf_program {

        u_int bf_len

        struct bpf_insn *bf_insns}

"""

class bpf_program(ctypes.Structure):

    _fields_ = [("bf_len", ctypes.c_int),("bf_insns", ctypes.c_void_p)]

class sockaddr(ctypes.Structure):

    _fields_=[("sa_family",ctypes.c_uint16),("sa_data",ctypes.c_char*14)]

class pcap_pkthdr(ctypes.Structure):

    _fields_ = [("tv_sec", ctypes.c_long), ("tv_usec", ctypes.c_long), ("caplen", ctypes.c_uint), ("len", ctypes.c_uint)]

       

pkthdr = pcap_pkthdr()

program = bpf_program()

# prepare args

snaplen = ctypes.c_int(1500)

#buf = ctypes.c_char_p(filter)

optimize = ctypes.c_int(1)

mask = ctypes.c_uint()

net = ctypes.c_uint()

to_ms = ctypes.c_int(100000)

promisc = ctypes.c_int(1)

filter = bytes(str("port 80"), 'ascii')

buf = ctypes.c_char_p(filter)

errbuf = ctypes.create_string_buffer(256)

pcap_close = pcap.pcap_close

pcap_lookupdev = pcap.pcap_lookupdev

pcap_lookupdev.restype = ctypes.c_char_p

#pcap_lookupnet(dev, &net, &mask, errbuf)

pcap_lookupnet = pcap.pcap_lookupnet

#pcap_t *pcap_open_live(const char *device, int snaplen,int promisc, int to_ms,

#char *errbuf

pcap_open_live = pcap.pcap_open_live

#int pcap_compile(pcap_t *p, struct bpf_program *fp,const char *str, int optimize,

#bpf_u_int32 netmask)

pcap_compile = pcap.pcap_compile

#int pcap_setfilter(pcap_t *p, struct bpf_program *fp)

pcap_setfilter = pcap.pcap_setfilter

#const u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h)

pcap_next = pcap.pcap_next

# int pcap_compile_nopcap(int snaplen, int linktype, struct bpf_program *program,

# const char *buf, int optimize, bpf_u_int32 mask)

pcap_geterr = pcap.pcap_geterr

pcap_geterr.restype = ctypes.c_char_p

#check for default lookup device

dev = pcap_lookupdev(errbuf)

#override it for now ..

dev = bytes(str("wlan0"), 'ascii')

if(dev):

    print("{0} is the default interface".format(dev))

else:

    print("Was not able to find default interface")

       

if(pcap_lookupnet(dev,ctypes.byref(net),ctypes.byref(mask),errbuf) == -1):

    print("Error could not get netmask for device {0}".format(errbuf))

    sys.exit(0)

else:

    print("Got Required netmask")

handle = pcap_open_live(dev,snaplen,promisc,to_ms,errbuf)

if(handle is False):

    print("Error unable to open session : {0}".format(errbuf.value))

    sys.exit(0)

else:

    print("Pcap open live worked!")

if(pcap_compile(handle,ctypes.byref(program),buf,optimize,mask) == -1):

    # this requires we call pcap_geterr() to get the error

    err = pcap_geterr(handle)

    print("Error could not compile bpf filter because {0}".format(err))

else:

    print("Filter Compiled!")

if(pcap_setfilter(handle,ctypes.byref(program)) == -1):

    print("Error couldn't install filter {0}".format(errbuf.value))

    sys.exit(0)

else:

    print("Filter installed!")

if(pcap_next(handle,ctypes.byref(pkthdr)) == -1):

    err = pcap_geterr(handle)

    print("ERROR pcap_next: {0}".format(err))

print("Got {0} bytes of data".format(pkthdr.len))

pcap_close(handle)