爬虫简单上手实战

urllib 库的基本使⽤:

所谓⽹⻚抓取,就是把 URL 地址中指定的⽹络资源从⽹络流中读取出来,保存到本地。 在 Python2 中,我们使⽤ urllib2 这个组件来抓取⽹⻚。在 python3.x 中被改为 urllib.request。

urlopen:

import urllib.request #导入爬虫用到的模块
response=urllib.request.urlopen("http://www.baidu.com")#利用这个模块的urlopen()功能打开百度网址
html=response.read()#把打开的网址读出来,赋值给html
print(html)#打印出来html中的内容

  内容如下:

#由于内容过多就不显示具体内容,我们通过测试html中的长度来证明
print(len(html))
#结果为
153227

  实际上,如果我们在浏览器上打开百度主⻚, 右键选择“查看源代码”,你会发现,跟我们刚才打印出来的是⼀模⼀样。也就是说,   上⾯的4⾏代码就已经帮我们把百度的⾸⻚的全部代码爬了下来。

User-Agent:

但是这样直接⽤python的 urllib.request给⼀个⽹站发送请求的话,确实略有些唐突了,就好⽐,⼈家每家都有⻔,你以⼀个路⼈的身份直接闯进去显然不是很礼貌。所以有⼀些站点不喜欢被程序(⾮⼈为访问)访问,有可能会拒绝你的访问请求。但是如果我们⽤⼀个合法的身份去请求别⼈⽹站,显然⼈家就是欢迎的。

所以我们就应该给我们的这个代码加上⼀个身份,就是所谓的 User-Agent 头。

User-Agent?显然如果你不是学习前端专业的,这个东⻄确实对于后端开发⼯程师是⼀个头疼的东⻄,不过不要紧,不是我们的东⻄我们只作为了解即可。我们只需要知道,⽤ 不同的浏览器 在发送请求的时候,会有不同的 UserAgent 头。浏览器 就是互联⽹世界上 被允许的身份 。那么如果你不想你的爬⾍代码成为⼀个路⼈,你需要伪装成⼀个被公认的浏览器 。伪装的办法就是给⾃⼰的请求加上⼀个对应的 User-Agent 头。下面来一段代码。

import urllib.request
url = "http://www.baidu.com"
header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4094.1 Safari/537.36"}
req=urllib.request.Request(url,headers=header)
resonse=urllib.request.urlopen(req)
html=resonse.read()
print(len(html))
解释一下上面的代码。
import urllib.request  #导入爬虫用到的库
url = "http://www.baidu.com" #这里是需要爬取的网站,用url保存一下
#下面这个是网页的头,就是我们模拟的一个身份地址,有了这个就可以正常的访问网页了
下面讲解一下怎么找到这个东西:
方法很多,博主常用的是:进入百度的首页,按下F12,你会看到网页源代码,接下来看一下最上面一行有没有Network,有没有你都按F5刷新一下,然后按照接下里给的步骤找到,全部复制下来。
header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4094.1 Safari/537.36"}
#用Request的方法去模拟用户请求
req=urllib.request.Request(url,headers=header)
接下里正常操作就行

爬虫简单上手实战

第二步里面的只要找到后缀带有.js的都可以。

案例:批量爬取⻚⾯数据

⾸先我们创建⼀个 python⽂件, tiebaSpider.py,我们要完成的是,输⼊⼀个百度贴吧的地址,⽐如百度贴吧 LOL 吧  第⼀⻚:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0  这个是 lol 吧的第⼀⻚的 url 地址,如果打开第⼆⻚,你会发现他的 url 如下: 第⼆⻚: http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=50  第三⻚: http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=100发现规律了吧,贴吧中每个⻚⾯不同之处,就是 url 最后的 pn 的值,其余的都是⼀样的,我们可以抓住这个规律。

简单写⼀个⼩爬⾍程序,来爬取百度 LOL 吧的所有⽹⻚。

我们已经之前写出⼀个爬取⼀个⽹⻚的代码。现在,我们可以将它封装成⼀个⼩函数 loadPage,供我们使⽤。

def loadPage(url):
'''
通过 URL 请求爬取到 html 静态⻚⾯源代码
url:需要爬取的 url 地址
'''
    req = urllib.request.Request(url)
    response = urllib.request.urlopen(req)
    html = response.read()
    return html

接下来,我们写⼀个百度贴吧爬⾍接⼝,我们需要传递 3 个参数给这个接⼝, ⼀个是我们要爬取的 url 地址,以及起始⻚码和终⽌⻚码,表示要爬取⻚码的范围。一般使用for循环自动爬取多个网页即可。

def tiebaSpider(url, beginPage, endPage):
'''
百度贴吧爬⾍核⼼程序:
url: 要爬取的 url 地址
beginPage: 爬⾍贴吧的起始⻚数
endPage: 爬⾍贴吧的终⽌⻚数
'''
    user_agent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1
    ; Trident/5.0;" # IE9.0 的 User-Agent
    headers = {"User-Agent":user_agent}
    for i in range(beginPage, endPage+1):
    pn = 50 * (i - 1)
    html = loadPage(url+str(pn))  #构造成一个新的网址,只要改变pn的不同,就能进入不同的页面

最后如果我们希望将爬取到了每⻚的信息存储在本地磁盘上,我们可以简单写⼀个存储⽂件的接⼝。

def writeFile(file_name, text):
'''
将字符串内容写到⽂件中: 
file_name: ⽂件路径
text: 要写进的字符串
print "正在存储⽂件" + file_name
'''
    f = open(file_name, 'w+')
    f.write(text)
    f.close()

ok,接下来就是写⼀个 main 函数吧,然后提示⽤户输⼊即将爬取的百度贴吧 url 地址。 ( 注意 :百度贴吧最后⻚码” pn= “后的数字,这些数字为我们传⼊的⻚码参数,所以我们再提供的时候不能包括数字)

if __name__ == ' __main__ ':
    tiebaurl = str(input('请输⼊贴吧的地址, 去掉 pn=后⾯的数字:'))
    beginPage = int(input('请输⼊开始的⻚数'))
    endPage = int(input('请输⼊结束的⻚数'))
    tiebaSpider(tiebaurl, beginPage, endPage)
    writeFile("写文件夹目录地址",tiebaSpider)

  综上, 全部代码完成。好了,最后我们测试⼀下:

请输⼊贴吧的地址, 去掉 pn=后⾯的数字: http://tieba.baidu.com/f?kw=lol&i
e=utf-8&pn=
请输⼊开始的⻚数 5 请输⼊结束
的⻚数 10
正在下载第 5 个⽹⻚正在存储⽂件 5.html
正在下载第 6 个⽹⻚ 正在存储⽂件 6.html
正在下载第 7 个⽹⻚ 正在存储⽂件 7.html 
正在下载第8 个⽹⻚ 正在存储⽂件8.html
正在下载第 9 个⽹⻚ 正在存储⽂件9.html 
正在下载第 10个⽹⻚ 正在存储⽂件10.html

总结:

其实很多⽹站都是这样的,当前⽹址下会有⼏个 html⻚⾯,分别对应⽹址后的⽹⻚序号。找出网址的特点,构造出来共同特征就能让爬虫持续爬取。一个简单的爬⾍程序就可以批量获取⽹站⻚⾯源码,然后我们就可以从中筛选⾃⼰想要的数据信息了。