有关网络爬虫的一个简单教程(一)

有关网络爬虫的一个简单教程(一)

目录

有关网络爬虫的一个简单教程(一)

那么接下来请运行下面的代码以确保接下来所需要用到的库函数已被安装在你的电脑上

一、伪造头文件“header”

1、定义header文件

2 将header发送出去

二、抛出异常的用法

三、了解BeautifulSoup的用法

3.1 find_all用法

3.2 find用法


在此之前你需要具备以下东西

  1. 基本的python知识(没有的请先看看廖雪峰的python教程)
  2. 基本的html语言(了解最基础的就好,不了解也没有太大的关系)
  3. python3.X版本
  4. 谷歌浏览器(一款很不错的浏览器,接下来会用到)

那么接下来请运行下面的代码以确保接下来所需要用到的库函数已被安装在你的电脑上

import requests  # 用来抓取网页的html源代码
from bs4 import BeautifulSoup

如果运行成功则继续往下,若报错请先下载安装库函数。

接下来我们分三个板块来介绍


一、伪造头文件“header”

可以阅读这篇博客怎么在爬虫代码中伪装header

伪造头文件“header”主要有以下两个部分

  1. 定义header,即将header传入
  2. 将header发送出去

1、定义header文件

header信息本质上是一个字典,如下

    header = {
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Connection": "keep-alive",
        "Cookie": "HttpOnly; userNewsPort0=1; f_city=%E6%AD%A6%E6%B1%89%7C101200101%7C; zs=101200101%7C%7C%7Cyd-uv; vjuids=-a98e1edf2.16f3bd4f323.0.5ca00b7cccefa; vjlast=1577256809.1577256809.30; Hm_lvt_24b77a56c77ce27d009359b331cde12e=1577256858,1577257296,1577257628,1577323975; Hm_lvt_26f859e26fb1d9afca60151d2d1fe304=1577236991,1577323975; Hm_lvt_080dabacb001ad3dc8b9b9049b36d43b=1577236991,1577323975; Wa_lvt_1=1577236991,1577323975; HttpOnly; Hm_lpvt_26f859e26fb1d9afca60151d2d1fe304=1577324245; Hm_lpvt_24b77a56c77ce27d009359b331cde12e=1577324245; Hm_lpvt_080dabacb001ad3dc8b9b9049b36d43b=1577324245; Wa_lpvt_1=1577324245",
        "Host": "www.weather.com.cn",
        "Referer": "http://www.weather.com.cn/weather/101190401.shtml",
        "Upgrade-Insecure-Requests": "1",
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"
    }

就是key-value对应的关系(key和value都是字符串,这就是它们为什么都加引号的原因),当然最重要的key是Referer和User-Agent(用户代理),相应的value信息可以利用谷歌浏览器的开发者工具来找到(如下节所示)

1.1 查找header的相关信息

找到目标网站(这里以豆瓣读书为例),在空白处鼠标右键——选择检查,调出开发者工具(或者通过右上角找到开发者工具,或者利用快捷键,因为不同电脑的快捷键不一样这里就不说了)——选择Network——刷新——在name里面找到最上面(也就是第一个)的一个文件,单击——在request headers中即可找到相关的header信息

有关网络爬虫的一个简单教程(一)_第1张图片

有关网络爬虫的一个简单教程(一)_第2张图片

有关网络爬虫的一个简单教程(一)_第3张图片

注:header信息应该放在一个字典中,并且key和value都是字符串,所以复制之后记得加引号,冒号前是key值,冒号后是value值;

2 将header发送出去

我们主要通过request库函数来实现,request库主要用于抓取网页的html源代码,有关request库的详细介绍可以点击此(或自行查看相关博客)

有关网络爬虫的一个简单教程(一)_第4张图片

在这里我们主要用到的是get方法,用法如下

import requests
requests.get(url,**kwargs)

其中url是网址(即你想爬取网站的网址),**kwargs是可选关键词,根据需要进行选取(具体介绍可以自行查找)

到这里就是通过伪装header文件假装自己是一个浏览器向服务器发送一个请求,最终得到相关信息的过程。


二、抛出异常的用法

在发送请求的过程中难免会出现一些错误,所以我们希望最终的代码里面可以抛出异常,这里就需要了解一下抛出异常的基本用法

这里主要介绍try...except的错误处理机制(更详细的介绍可以看看廖雪峰的python教程里面有详细介绍),看如下例子

try:
    print('try...')
    r = 10 / 0
    print('result:', r)
except ZeroDivisionError as e:
    print('except:', e)
finally:
    print('finally...')
print('END')

运行逻辑如下

先运行try后面的语句块,若出错

  • 运行except语句块
  • 执行完except语句块后,如果有finally语句块则执行finally语句块
  • 执行完毕

若没有出错

  • 不执行except语句块
  • 若有finally语句块则执行finally语句块
  • 执行完毕

注:可以没有finally语句块


三、了解BeautifulSoup的用法

首先我们加载模块

from bs4 import BeautifulSoup

有关BeautifulSoup的详细介绍可以看看官方文档及BeautifulSoup库用法总结

有关网络爬虫的一个简单教程(一)_第5张图片

基本用法如下

soup=BeautifulSoup(markup,"html.parser")

第一个参数是网页的html源代码,后面一个参数是固定的。例如

html_doc = """
The Dormouse's story
    

The Dormouse's story

Once upon a time there were three little sisters; and their names were Elsie, Lacie and Tillie; and they lived at the bottom of a well.

...

""" from bs4 import BeautifulSoup soup = BeautifulSoup(html_doc, 'html.parser')

有关网络爬虫的一个简单教程(一)_第6张图片

比如我们还是以豆瓣读书为例

利用开发者工具——选择element,即可看到相关html源代码

有关网络爬虫的一个简单教程(一)_第7张图片

爬虫主要是找对应标签里的内容,所以我们主要就是BeautifulSoup里面的查找方法(主要有find和find_all用法)

3.1 find_all用法

具体格式如下(注意返回的是一个列表

find_all( name , attrs , recursive , string , **kwargs )

我们主要使用name参数,后面的参数具体意义可以看官方文档,里面有详细的介绍,比如

print(soup.find_all("a"))#查找所有标签为a的内容

输出结果如下

find_all可以查找所有名字为 name 的tag(可以通过设置更多条件来精确查找),比如

print(soup.find_all("a", {"href": "http://example.com/elsie"}))

查找标签为a,href为"http://example.com/elsie"的所有内容,输出如下

3.2 find用法

具体格式如下(返回的是结果)

find(name , attrs , recursive , string , **kwargs )

find_all是找全部,find是找一个(第一个出现的),在某些情况下两者等价,比如

soup.find_all('title', limit=1)
soup.find('title')

上面两句代码是一样的


才了解掌握上面的基础知识后,我们接下来开始实践操作,下篇博客见!

你可能感兴趣的:(网络爬虫,python)