关于自己
菜鸟第一次写,把一天所学简单记录一下,但会认真描述所学内容,方便学习,如有错误欢迎指出改正。
目标
看到此篇,可以自己爬取猫眼榜单Top100信息。
什么是爬虫
简单地说,就是抓取网络数据的程序。
其实就是用Python程序(模仿人)访问网站,获取网站的数据,而且模仿的越逼真越好。
为什么要爬虫
当你需要数据时,比如项目开发完需要数据进行测试,人工手动的往数据库里添加数据耗费太多人力,使用爬虫可以通过程序来完成。
爬虫步骤
1.确定需要爬取的URL地址
2.由请求模块向URL地址发出请求,并得到网站的响应
3.从响应内容中提取所需数据
1.所需数据,保存
2.页面中有其他需要继续跟进的URL地址,继续第2步去发请求,如此循环
爬虫所需要的工具
从爬虫步骤不难看出,爬虫的关键在于以下两点:
1.通过请求模块实现用程序访问网站
2.得到相应后,我们需要解析网页源代码,获取想要的数据
先上一段简单爬取新浪首页的代码
# 导入模块库(python内置的模块库)
from urllib import request
url = 'https://www.sina.com.cn/'
# 通过request的urlopen方法访问目标网站,获得响应对象
res = request.urlopen(url)
# 使用响应对象的read方法得到网页源代码,但是得到的是bytes格式的,需要用decode方法转成string
html = res.read().decode('utf-8')
print(html)
运行结果:
注:以上只是部分运行结果截图;同时获得的响应对象通过read方法得到的结果是bytes,通过decode方法可以转为string,string可以通过encode转为bytes格式。
思考:网站如何来判定是人类正常访问还是爬虫程序访问???
通过一段代码来解释上述思考
# 导入模块库(python内置的模块库)
from urllib import request
url = 'http://httpbin.org/get'
# 通过request的urlopen方法访问目标网站,获得响应对象
res = request.urlopen(url)
# 使用响应对象的read方法得到网页源代码,但是得到的是bytes格式的,需要用decode方法转成string
html = res.read().decode('utf-8')
print(html)
和上一段代码相比,只是改变了url。
让我们看一下响应内容:
看到此,相信思考提出的问题已经得到了解答,没错,就是通过请求头确认到底是人还是程序访问网站的。那么,我们该怎么武装自己呢?不让网站发现我们是python程序呢?
没错,我们先上代码:
from urllib import request
# 定义常用变量
url = 'http://httpbin.org/get'
headers = {'User-Agent': 'Mozilla/4.0 '}
# 包装请求
req = request.Request(url=url, headers=headers)
# 获取页面响应
res = request.urlopen(req)
# 获得页面源代码
html = res.read().decode('utf-8')
print(html)
让我们看一下结果:
从运行结果可知,请求头应该被我们修改。修改的方法就是用request.Request()
案例1
前面的代码相信都不难,现在来一个案例。
百度贴吧数据抓取
要求
1.输入贴吧名称
2.输入起始页
3.输入终止页
4.保存到本地文件:第1页.html、第2页.html ...
案例步骤
1.找URL规律
1.不同吧
对于不同吧,url中kw不同 。
2.不同页
第1页:http://tieba.baidu.com/f?kw=????&pn=0
第2页:http://tieba.baidu.com/f?kw=????&pn=50
第n页:pn=(n-1)*50
对于不同页,参数pn不同
2.获取网页内容
3保存(本地文件、数据库)
话不多说,上代码!!!
from urllib import request,parse
import time
import random
class Tieba_Spider():
# 定义常用变量
def __init__(self):
self.url = 'http://tieba.baidu.com/f?kw={}&pn={}'
self.headers = {'User-Agent': 'Mozilla/4.0'}
# 获取页面源代码
def get_page(self, url):
req = request.Request(url=url, headers=self.headers)
res = request.urlopen(req)
html = res.read().decode('utf-8')
return html
# 解析源代码,提取数据
def parse_page(self):
pass
# 保存数据
def write_page(self, filename, html):
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
# 主函数
def main(self):
name = input('请输入你要去的吧名:')
start = int(input('请输入访问的起始页:'))
end = int(input('请输入访问的终止页:'))
kw = parse.quote(name)
for item in range(start, end+1):
url = self.url.format(kw, (item-1)*50)
html = self.get_page(url=url)
filename = '{}-第{}页.html'.format(name, item)
self.write_page(filename=filename, html=html)
print('第{}页下载完成'.format(item))
time.sleep(random.randint(1, 3))
if __name__ == '__main__':
spider = Tieba_Spider()
spider.main()
运行结果: