python爬虫新手准备工作

需要:requests、bs4、BeautifulSoup、lxml、re、urllib
Python版本: Python3.7
运行平台: Windows
IED: pyCharm 2020.3

使用 requests 库请求网站

  • 安装 requests 库
    首先在 PyCharm 中安装 requests 库,为此打开 PyCharm,单击“File”(文件)菜单,选择“Setting for New Projects...”命令👇

    文件 - 设置

选择“Project Interpreter”(项目编译器)命令,确认当前选择的编译器,然后单击左下角的加号

在搜索框输入:requests(注意,一定要输入完整,不然容易出错),然后单击左下角的“Install Package”(安装库)按钮👇。

输入requests,然后安装

安装完成后,会在 Install Package 上显示“Package‘requests’ installed successfully”(库的请求已成功安装)👇;如果安装不成功将会显示提示信息。

安装成功

最后记得点击【确定】按钮

最后记得点击【确定】按钮

简单的网站抓取

  • 使用 GET 方式抓取数据

    新建python文件
    目录结构
# hello.py文件
# 导入requests包
import requests

url = 'http://www.cntour.cn/'
strhtml = requests.get(url)
print(strhtml.text)

快捷键ctrl+shift+F10或者点击

绿色三角形,就会编译,编译结果如下

运行结果
  • 使用 POST 方式抓取数据【抓取有道翻译网站】
    有道翻译的网址:http://fanyi.youdao.com/,进入有道翻译页面。
    按快捷键 F12,进入开发者模式,单击 Network,此时内容为空,如下所示:

在有道翻译中输入“我爱中国”,单击“翻译”按钮,如下所示:

在开发者模式中,依次单击“Network”按钮和“XHR”按钮,找到翻译数据,如下所示:

单击 Headers,发现请求数据的方式为 POST。如图所示:

找到数据所在之处并且明确请求方式之后,接下来开始撰写爬虫。
首先,将 Headers 中的 URL 复制出来,并赋值给 url,代码如下:

url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'

POST 的请求获取数据的方式不同于 GET,POST 请求数据必须构建请求头才可以。
Form Data 中的请求参数如图所示,将其复制并构建一个新字典::

Form Data中的请求参数
Form_data = {
        'i': '我爱中国',
        'from': 'AUTO',
        'to': 'AUTO',
        'smartresult': 'dict',
        'client': 'fanyideskweb',
        'salt': '16074811609507',
        'sign': 'e637db0683139d97331fe7a370b6ca82',
        'lts': '1607481160950',
        'bv': '72f8a2699d04985331209000387bc6c3',
        'doctype': 'json',
        'version': '2.1',
        'keyfrom': 'fanyi.web',
        'action': 'FY_BY_REALTlME',
        'typoResult': 'false'
    }

接下来使用 requests.post 方法请求表单数据,代码如下:

import requests        #导入requests包
response = requests.post(url, data=Form_data)

将字符串格式的数据转换成 JSON 格式数据,并根据数据结构,提取数据,并将翻译结果打印出来,代码如下:

import json
content = json.loads(response.text)
print(content['translateResult'][0][0]['tgt'])

Beautiful Soup库

通过 requests 库已经可以抓到网页源码,接下来要从源码中找到并提取数据。Beautiful Soup 是 python 的一个库,其最主要的功能是从网页中抓取数据。Beautiful Soup 目前已经被移植到 bs4 库中,也就是说在导入 Beautiful Soup 时需要先安装 bs4 库。

安装bs4

lxml 库

安装好 bs4 库以后,还需安装 lxml 库。如果我们不安装 lxml 库,就会使用 Python 默认的解析器。尽管 Beautiful Soup 既支持 Python 标准库中的 HTML 解析器又支持一些第三方解析器,但是 lxml 库具有功能更加强大、速度更快的特点,因此推荐安装 lxml 库。

安装 lxml

安装 Python 第三方库后,输入下面的代码,即可开启 Beautiful Soup 之旅:

粘贴如下:

#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li:nth-child(1) > a

将 li:nth-child(1)中冒号(包含冒号)后面的部分删掉,代码如下:

#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a

使用 soup.select 引用这个路径,代码如下:

data = soup.select('#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a')
完整代码和运行结果

清洗和组织数据

至此,获得了一段目标的 HTML 代码,但还没有把数据提取出来,接下来在 PyCharm 中输入以下代码:

for item in data:
    result={
        'title':item.get_text(),
        'link':item.get('href')
    }
print(result)
运行结果

从上图发现:文章的链接中有一个数字 ID。下面用正则表达式提取这个 ID。需要使用的正则符号如下:

  • 【 \d 】匹配数字
  • 【 + 】匹配前一个字符1次或多次
    在 Python 中调用正则表达式时使用 re 库,这个库不用安装,可以直接调用。
import re
for item in data:
    result={
        "title":item.get_text(),
        "link":item.get('href'),
        'ID':re.findall('\d+',item.get('href'))
    }
print(result)
# 完整代码
# 导入requests包
import requests
from bs4 import BeautifulSoup
import re
import time
# time.sleep(3)
url = 'http://www.cntour.cn/'
# 用 GET 方式获取数据; 将获取到的数据存到 strhtml 变量中
strhtml = requests.get(url)
# strhtml.text 表示网页源码
# print(strhtml.text)
# 首先,HTML 文档将被转换成 Unicode 编码格式,然后 Beautiful Soup 选择最合适的解析器来解析这段文档,此处指定 lxml 解析器进行解析。
# 解析后便将复杂的 HTML 文档转换成树形结构,并且每个节点都是 Python 对象。这里将解析后的文档存储到新建的变量 soup 中
soup = BeautifulSoup(strhtml.text, 'lxml')
data = soup.select('#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a')
for item in data:
    result = {
        # 提取的数据是标题和链接,标题在<a>标签中,链接在<a>标签的 href 属性中
        # 提取标签的正文用 get_text() 方法
        # 提取标签中的 href 属性用 get() 方法,在括号中指定要提取的属性数据,即 get('href')。
        'title': item.get_text(),
        'link': item.get('href'),
        'ID': re.findall('\d+', item.get('href'))
    }
print(result)
# print(data)
完整代码和运行结果

findall ():第一个参数表示正则表达式,第二个参数表示要提取的文本。

服务器第一种识别爬虫的方式就是通过检查连接的 useragent 来识别到底是浏览器访问,还是代码访问的。如果是代码访问的话,访问量增大时,服务器会直接封掉来访 IP。服务器识别浏览器访问的方法就是判断 keyword 是否为 Request headers 下的 User-Agent.

User-Agent
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值