文章目录
  1. 1. 正则表达式:
    1. 1.1. 常用方法:
    2. 1.2. 常用符号:
    3. 1.3. 常用技巧:
  2. 2. Python3爬虫入门
    1. 2.1. 给文件加入头信息,用以模拟浏览器访问:
    2. 2.2. 用python抓取指定网页:
    3. 2.3. 实现可变网站的访问:
    4. 2.4. 将网页图片内容保存:

前几个礼拜接受了老师的要求给大家讲节课,本来说好了讲讲Python的GUI界面wxpython,但是wxpython只支持到了python2,说是出了个phoenix版本的可以支持python3,无奈找了半天也没找到,再加上自己对GUI实在也是无感,就放弃寻找了,恰巧有人讲了tkinter,于是我厚着脸皮跟老师说能不能换成爬虫或是web之类的,老师竟然同意啦,所以我就转战爬虫了,网上的python3爬虫教程之类的少的可怜,初学起来也确实是不容易,不是说他难,而是基本教程什么的都是python2,容易混起来,要是没有发现的话调试得都会发疯。因此我写下这篇文章,一来是给自己长点记性,二来也能分享给大家,大家一起学习进步。

正则表达式:

说到入门的爬虫,必然要用到正则表达式,正则表达式是很简单的,相信大家半小时之类肯定学得溜得飞起,在这里我就简单说一点。

  • 常用方法:findall,search,sub
  • 常用符号:点号,星号,问号与括号
  • 常用技巧

常用方法:

  • findall: 匹配所有符合规律的内容,返回包含结果的列表
  • Search:匹配并提取第一个符合规律的内容,返回一个正则表达式对象(object)
  • Sub:替换符合规律的内容,返回替换后的值

常用符号:

  • . : 匹配任意字符,换行符\n除外

    1
    2
    3
    4
    5
    6
    #.的使用举例
    a = 'xy123'
    b = re.findall('x...',a)
    print(b)
    >>>
    ['xy12']
  • *:匹配前一个字符0次或无限次

    1
    2
    3
    4
    5
    6
    #*的使用举例
    a = 'xyxy123'
    b = re.findall('x*',a)
    print(b)
    >>>
    ['x', '', 'x', '', '', '', '', '']
  • ? :匹配前一个字符0次或1次

    1
    2
    3
    4
    5
    6
    #?的使用举例
    a = 'xy123'
    b = re.findall('x?',a)
    print(b)
    >>>
    ['x', '', '', '', '', '']

上面的内容全部都是只需要了解即可,需要掌握的只有下面这一种组合方式(.*?)

  • .*:贪心算法

    1
    2
    3
    4
    5
    6
    #.*的使用举例
    secret_code = 'hadkfalifexxhaixxfasdjifja134xxnanxx23345sdfxxuniversityxx8dfse'
    b = re.findall('xx.*xx',secret_code)
    print(b)
    >>>
    ['xxhaixxfasdjifja134xxnanxx23345sdfxxuniversityxx']
  • .*?:非贪心算法

    1
    2
    3
    4
    5
    6
    #.*?的使用举例
    secret_code = 'hadkfalifexxhaixxfasdjifja134xxnanxx23345sdfxxuniversityxx8dfse'
    c = re.findall('xx.*?xx',secret_code)
    print(c)
    >>>
    ['xxhaixx', 'xxnanxx', 'xxuniversityxx']
  • ():括号内的数据作为结果返回

    1
    2
    3
    4
    5
    6
    #使用括号与不使用括号的差别
    secret_code = 'hadkfalifexxhaixxfasdjifja134xxnanxx23345sdfxxuniversityxx8dfse'
    d = re.findall('xx(.*?)xx',secret_code)
    print(d)
    >>>
    ['hai', 'nan', 'university']

常用技巧:

1
2
3
4
5
import re #导入re库,之后调用re库需要re.
from re import #导入re库,之后调用re库不需要re.
from re import findall,search,sub,S
不需要complie #一般情况下不建议使用complie
使用\d+匹配纯数字

一般情况下使用sub实现换页功能,并使用findall与search从大量文本中匹配感兴趣的内容,谨记:

  • 灵活使用findall与search
  • 先抓大再抓小

Python3爬虫入门

  • 给文件加入头信息,用以模拟浏览器访问
  • 用python抓取指定网页
  • 实现可变网站的访问
  • 将网页内容保存

给文件加入头信息,用以模拟浏览器访问:

我们知道很多网站为了防止爬虫的恶意抓取,都采取了相应的技术来禁止爬虫的抓取,但是我们用户确实可以正常访问的,所以我们要是让我们的爬虫模拟我们访问网站来进行抓取,问题不就迎刃而解了吗?恰好我们这里可以给文件加入头信息,来模拟浏览器的访问。

代码如下:

1
2
3
4
5
6
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {
'Connection': 'Keep-Alive',
'Accept': 'text/html, application/xhtml+xml, */*',
'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'

怎么获取头信息,FireFox可以安装一些firebug、Live HTTP Headers之类的插件,有的浏览器在开发者工具里是可以直接看到的,当然也有其他插件可以实现。

用python抓取指定网页:

代码如下:

1
2
3
4
5
6
import urllib.request
url= "http://www.baidu.com"
data = urllib.request.urlopen(url).read()#
data = data.decode('UTF-8')
print(data)

在python3中是用urllib.request代替python2中的urllib的,python3中的urllib有了更多的功能,官方文档是这样讲的:

a new urllib package was created. It consists of code from
urllib, urllib2, urlparse, and robotparser. The old
modules have all been removed. The new package has five submodules:
urllib.parse, urllib.request, urllib.response,
urllib.error, and urllib.robotparser. The
urllib.request.urlopen() function uses the url opener from
urllib2. (Note that the unittests have not been renamed for the
beta, but they will be renamed in the future.)

urllib.request.urlopen(url)官方文档返回一个 http.client.HTTPResponse 对象, 这个对象又用到的read()方法;返回数据;这个函数返回一个 http.client.HTTPResponse 对象, 这个对象又有各种方法, 比如我们用到的read()方法。

实现可变网站的访问:

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
import urllib
import urllib.request
data={}
data['word']='python spider'
url_values=urllib.parse.urlencode(data)
url="http://www.baidu.com/s?"
full_url=url+url_values
a = urllib.request.urlopen(full_url)
data=a.read()
data=data.decode('UTF-8')
print(data)
##打印出网址:
a.geturl()

data是一个字典, 然后通过urllib.parse.urlencode()来将data转换为 ‘word=python+spider’的字符串, 最后和url合并为full_url。

将网页图片内容保存:

代码如下:

1
2
3
4
5
6
7
8
9
pic = urllib.request.urlopen(picurl)
jpgpic = pic.read()
#首先你得有个pic文件夹
fp = open('pic/'+str(j)+'.jpg',"wb")
print('now downloading:')
# 写入文件
fp.write(jpgpic)
fp.close()
j=j+1

将网站上的jpg图片保存在本地pic文件夹内,当然你也可以保存在其他地方。利用文件时,记得关闭哦。

文章出自:Krzer http://www.krzer.com/版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。

文章目录
  1. 1. 正则表达式:
    1. 1.1. 常用方法:
    2. 1.2. 常用符号:
    3. 1.3. 常用技巧:
  2. 2. Python3爬虫入门
    1. 2.1. 给文件加入头信息,用以模拟浏览器访问:
    2. 2.2. 用python抓取指定网页:
    3. 2.3. 实现可变网站的访问:
    4. 2.4. 将网页图片内容保存: