Python_Crawler专题

🌈爬虫的基本概念

  1. 什么是爬虫:

通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程

  1. 爬虫带来的风险:

爬虫干扰了被访问网站的正常运营

爬虫抓取了受到法律保护的特定类型的数据或信息

  1. 爬虫在使用场景中的分类:

通用爬虫:抓取系统中重要组成部分,抓取的是一整个页面的数据

聚焦爬虫:是建立在通用爬虫的基础之上,抓取的是页面中特定的局部内容

增量式爬虫:检测网站中数据更新的情况,只会抓取网站中最新更新出来的数据。


🌈爬虫协议

  1. robots.txt协议:

君子协议。规定了网站中哪些数据可以被爬虫爬取哪些数据不可以。

使用:在网址后面加 \robots.txt , allow表示可以,disallow表示不可以

EG: https://www.baidu.com/robots.txt

  1. http协议

概念:服务器与客户端进行数据交互的一种形式。

  1. https协议

安全的超文本传输协议

加密方式:1、对称秘钥加密;2、非对称秘钥加密;3、证书秘钥加密


🌈常用头信息

  1. 常用请求头信息:

User-Agent:请求载体的身份标识

Connection:请求完毕后,是断开连接还是保持连接

  1. 常用响应头信息:

Content-Type: 服务器响应回客户端的数据类型


🌈Chrome浏览器开发者工具

首先在正式进行爬虫前,需了解Chrome开发者工具,打开浏览器,直接按F12快捷键即可

NetWork 网络请求抓包

Preserve log (保留日志),避免界面跳转覆盖信息


🌈Requests

requests模块:

python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高。

作用:模拟浏览器发送请求

返回的response的内容解析

属性

说明

r.status_code

HTTP请求的返回状态。200表示连接成功,400表示失败

r.text

HTTP响应内容的字符串形式

r.ecoding

HTTP header 中猜测的响应内容编码方式

r.apparent_encoding

从内容中分析出的响应内容的编码方式(备选编码方式)

r.content

HTTP响应内容的二进制形式

requests通用框架(爬取网页更有效)

import requests
def getHTMLText(url):
    try:
        r = requests.get(url,timeout = 30)
        r.raise_for_status()#如果状态不是200,则出现异常
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "异常"

Requests库的七种方法

方法

说明

requests.request( )

构造一个请求,支撑以下各方法的基础方法

requests.get( )

获取HTML网页的主要方法,对应于HTTO的GET

requests.head( )

获取HTML网页头信息的方法,对应于HTTP的HEAD

requests.post( )

向HTML网页提交POST请求的方法,对应于HTTP的POST

requests.put( )

向HTML网页提交PUT请求的方法,对应于HTTP的PUT

requests.patch( )

向HTML网页提交POST请求的方法,对应于HTTP的POST的PATCH

requests.delete( )

向HTML网页提交删除请求,对应于HTTP的DELETE

🌈爬虫实战

如何使用:(requests模块的编码流程)

a. 指定url;b. 发起请求;c. 获取响应数据;d. 持久化存储
  1. 爬取搜狗

import requests
#step 1:指定url
url = 'https://www.sogou.com/'
#step 2:发起请求
#get方法会返回一个响应对象
response = requests.get(url = url)
#step 3:获取响应数据,text返回的是字符串形式的响应数据
page_text = response.text
#step 4:永久存储
with open('./sougou.html','w',encoding = 'utf-8') as fp:
    fp.write(page_text)
print('爬取成功')

爬取百度,发现会乱码,所以修改成第8行

import requests
#step 1:指定url
url = 'https://www.baidu.com/'
#step 2:发起请求
#get方法会返回一个响应对象
response = requests.get(url = url)
#step 3:获取响应数据,text返回的是字符串形式的响应数据
page_text = response.text.encode('latin-1').decode('utf-8')
#step 4:永久存储
with open('./baidu.html','w',encoding = 'utf-8') as fp:
    fp.write(page_text)
print('爬取成功')
  1. 简易网页搜索器(UA伪装)

——爬取搜狗指定词条对应的搜索结果页面

import requests
#UA伪装:将对应的User-Agent封装到一个字典中
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Edg/109.0.1518.61'
}
url = 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu'
#处理url携带的参数:封装到字典中
kw = input('enter a key word ...')
param = {
    'wd':kw
}
response = requests.get(url = url,params = param,headers = headers)
page_text = response.text
fileName = kw + '.html'
with open(fileName,'w',encoding = 'utf-8') as fp:
    fp.write(page_text)
print(fileName,'保存成功')

常用头伪装,构建一个列表:

agent_list = [
    "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    # IPod
    "Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    # IPAD
    "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
    "Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    # Android
    "Mozilla/5.0 (Linux; U; Android 2.2.1; zh-cn; HTC_Wildfire_A3333 Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    "Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    # QQ浏览器 Android版本
    "MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    # Android Opera Mobile
    "Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10",
    # Android Pad Moto Xoom
    "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
    # BlackBerry
    "Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+",
    # WebOS HP Touchpad
    "Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0",
    # Nokia N97
    "Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124",
    # Windows Phone Mango
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)",
    # UC浏览器
    "UCWEB7.0.2.37/28/999",
    "NOKIA5700/ UCWEB7.0.2.37/28/999",
    # UCOpenwave
    "Openwave/ UCWEB7.0.2.37/28/999",
    # UC Opera
    "Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999"
    ]
head = {"user-agent":random.choice(agent_list)}
url = "https://www.zhihu.com/billboard"
response = requests.get(url,headers=head)
  1. 图片爬取全代码并保存

import requests
import os
url = "图片网址"
root = "D://"
path = root + url.split('/')[-1] #命名图片为原名字
try:
    if not os.path.exists(root):
        os.mkdir(root)
    if not os.path.exists(path):
        r = requests.get(url)
        with open(path,'wb') as f :
            f.write(r.content)
            f.close()
            print('文件保存成功')
    else:
        print('文件已存在')
except:
    print('爬取失败')

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`from_crawler`是Scrapy中的一个类方法,用于创建一个新的Spider实例。它是Scrapy中的一个特殊方法,因为它可以访问Scrapy的核心组件和配置,例如Crawler对象、Settings对象和Signal manager。 `from_crawler`有一个默认的实现,它将Crawler对象、Settings对象和其他参数传递给Spider的构造函数。您可以重写这个方法来自定义Spider的初始化过程,例如添加信号处理程序或在Spider创建时执行其他任务。 以下是一个常见的使用`from_crawler`方法的示例,它在Spider创建时添加了一个信号处理程序,以便在Spider完成时关闭数据库连接: ```python from scrapy import signals class MySpider(scrapy.Spider): name = 'myspider' def __init__(self, *args, **kwargs): super(MySpider, self).__init__(*args, **kwargs) self.connection = None @classmethod def from_crawler(cls, crawler, *args, **kwargs): spider = super(MySpider, cls).from_crawler(crawler, *args, **kwargs) crawler.signals.connect(spider.spider_closed, signal=signals.spider_closed) return spider def spider_closed(self, spider): if self.connection is not None: self.connection.close() def parse(self, response): # 爬虫代码 ``` 在这个例子中,我们定义了一个名为`spider_closed`的方法,它在Spider完成时被调用。我们通过重写`from_crawler`方法来绑定这个方法,以便在创建Spider实例时添加信号处理程序。`spider_closed`方法检查数据库连接是否存在,并在存在时关闭连接。 请注意,`from_crawler`是一个类方法,它需要返回一个新的Spider实例。因此,在实现`from_crawler`方法时,您需要使用`super()`方法调用父类的`from_crawler`方法,然后返回新的Spider实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值