网络爬虫分类

  • 通用网络爬虫(搜索引擎使用,遵守robopts协议)
    robots协议:网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,通用网络爬虫需要遵守robots协议(君子协议)
    查看网站的robots协议: https://www.baidu.com/robots.txt
  • 聚焦网络爬虫:自己写的爬虫程序

爬取数据步骤

  • 确定需要爬取的URL地址
  • 由请求模块向URL地址发出请求,并得到网站的响应
  • 利用解析模块从响应内容中提取所需数据
    所需数据,保存
    页面中有其他需要继续跟进的URL地址,则继续第2步去发请求,如此循环

爬虫入门:

1.请求模块

python3爬虫 菜鸟教程 python爬虫最全教程_python3爬虫 菜鸟教程


python3爬虫 菜鸟教程 python爬虫最全教程_html_02


python3爬虫 菜鸟教程 python爬虫最全教程_爬虫_03


注意:

res.geturl() 返回实际地址解释:有些网页可能会进行重定向,从而返回另一个地址

代码举例:

from urllib import request
#获得相应对象
res=request.urlopen(url='http://www.baidu.com/')
#获取网页源代码(默认是字节串,需要转为字符串)
html=res.read().decode()
#获取实际地址
url=res.geturl()
#返回http响应码
code=res.getcode()

print(res)
print('='*30)
print(html)
print('='*30)
print(url)
print('='*30)
print(code)

结果:

<http.client.HTTPResponse object at 0x000001564CDFADC0>
==============================
<!DOCTYPE html><!--STATUS OK-->


    <html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta content="always" name="referrer"><meta name="theme-color" content="#2932e1"><meta name="description" content="全球领先的中文搜索引擎、致力于让网民更便捷地获取信息,找到所求。百度超过千亿的中文网页数据库,可以瞬间找到相关的搜索结果。"><link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" /><link rel="search" type="application/opensearchdescription+xml" href="/content-search.xml" title="百度搜索" /><link rel="icon" sizes="any" mask href="//www.baidu.com/img/baidu_85beaf5496f291521eb75ba38eacbd87.svg">
......
==============================
http://www.baidu.com/
==============================
200

问题:

python3爬虫 菜鸟教程 python爬虫最全教程_html_04


我们用于通过相关访问的数据:

User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Mobile Safari/537.36

通过python爬虫访问的数据如下:

headers下面内容

python3爬虫 菜鸟教程 python爬虫最全教程_python_05

如何改进?

python3爬虫 菜鸟教程 python爬虫最全教程_html_06


python3爬虫 菜鸟教程 python爬虫最全教程_爬虫_07


代码举例:

from urllib import request
# 1.定义常用变量
url='http://httpbin.org/get'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'}
# 2.包装请求
req=request.Request(url=url,headers=headers)
# 3.发请求
res=request.urlopen(req)
# 4.获取响应内容
html=res.read().decode()
print(html)

结果:

{
  "args": {}, 
  "headers": {
    "Accept-Encoding": "identity", 
    "Host": "httpbin.org", 
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1", 
    "X-Amzn-Trace-Id": "Root=1-6117d0cb-6a429a376d4882805141367c"
  }, 
  "origin": "222.137.196.191", 
  "url": "http://httpbin.org/get"
}

总结:

python3爬虫 菜鸟教程 python爬虫最全教程_python_08

urllib.parse编码

  • 作用:给URL地址中查询参数进行编码
  • 导入方式
    import urllib.parse
    from urllib import parse
  • 示例(url不能直接识别中文,需要编码进行转换)
    –编码前:https://www.baidu.com/s?wd=美女
    –编码后:https://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3

    拼接url的三种方式

    小练习:

python3爬虫 菜鸟教程 python爬虫最全教程_python_09


代码演示:

from urllib import request
from urllib import parse
# 1.拼接url地址
word = input('请输入百度搜索关键字:')
params=parse.urlencode({'wd':word})
url='http://www.baidu.com/s?{}'.format(params)#这个url我们需要提前观察它的结构
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'}
# 2.发请求获取响应内容
req=request.Request(url=url,headers=headers)
res=request.urlopen(req)
html=res.read().decode()
print(html)
# 3.保存到本地文件
filename=word+'.html'
with open(filename,'w',encoding='utf-8') as f:
    f.write(html)

总结:

python3爬虫 菜鸟教程 python爬虫最全教程_python3爬虫 菜鸟教程_10

入门实战案例:

python3爬虫 菜鸟教程 python爬虫最全教程_python_11


python3爬虫 菜鸟教程 python爬虫最全教程_python3爬虫 菜鸟教程_12

静态爬取一般步骤:

python3爬虫 菜鸟教程 python爬虫最全教程_python_13


代码如下:

class BaiduTiebaSpider:
    def __init__(self):
        self.ur1 = 'http://tieba.baidu.com/f?kw={}&pn={}'
        self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'}
    def get_html(self,url):
        req=request.Request(url=url,headers=self.headers)
        res=request.urlopen(req)
        html=res.read().decode()
        
        return html
    def parse_html(self):
        """解析提取数据的函数"""

        pass

    def save_html(self,filename,html):
        with open(filename,'w',encoding='utf8') as f:
            f.write(html)
    def run(self):
        name=input('请输入贴吧名:')
        start=int(input('请输入起始页:'))
        end=int(input('请输入终止页:'))
        params=parse.quote(name)
        # 1.拼接url地址
        for page in range(start,end+1):
            pn=(page-1)*50  #根据所选贴吧url规律计算得出
            url=self.ur1.format(params,pn)
            html=self.get_html(url)
            filename='{}_第{}页.html'.format(name,page)
            self.save_html(filename,html)
            #终端打印提示
            print('第%d页抓取成功' % page)
            # 控制数据抓取的频率
            time.sleep(random.randint(1,3))
test=BaiduTiebaSpider()
test.run()

结果:

请输入贴吧名:赵丽颖
请输入起始页:1
请输入终止页:3
第1页抓取成功
第2页抓取成功
第3页抓取成功

总结:

python3爬虫 菜鸟教程 python爬虫最全教程_python_14

温馨提示:

相关操作一定要在法律允许的范围内进行!