爬虫入门篇--简单爬取贴吧源代码

关于自己

菜鸟第一次写,把一天所学简单记录一下,但会认真描述所学内容,方便学习,如有错误欢迎指出改正。

目标

看到此篇,可以自己爬取猫眼榜单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()

运行结果:


你可能感兴趣的:(爬虫入门篇--简单爬取贴吧源代码)