只有python可以爬虫吗_无所不能的Python之爬虫那点事儿

今天给大家介绍一个有趣的新技术——爬虫。首先来讲一下啥是爬虫。

爬虫也叫网络爬虫,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。通俗的来讲,爬虫就是一段程序,它来根据你的设定自己去互联网上浏览网页并把这些信息下载下来,然后在从中提取出有用的信息。这些信息可以用在做数据分析、数据统计等等。

接下来我会用通俗的语言来讲解爬虫技术,这些都是基于我个人的理解所写的,水平有限,若有不对的地方请指正。

我们平常浏览的众多网站都是有对应的源代码的。如果你有兴趣,可以用你电脑的任意浏览器打开一个网站,然后按一下F12试试。此时你会看到:网页里所有的文字、图像、声音等等一切元素,都是由HTML源码编排而成。你打开的这个窗口其实就是网页源码的调试窗口,当你试着用鼠标在那些源码上移动时,你会发现每移动到一个地方,网页便会有对应的地方高亮起来。也就是说,当我们把这些被高亮的元素的源码下载下来并解析出来,我们便获取了这些元素。这便是爬虫程序要干的事儿。

既然我们需要下载源码,那我们首要的便是访问这个网站。这里会出现一些问题:因为有些网站有反爬虫技术,它会识别出你是爬虫程序,并中断你的访问甚至是封锁你的IP地址。这其中一个应对方法就是我们的爬虫程序里一定要写好HTTP请求头。HTTP请求头是当你正常用浏览器打开网页时,浏览器向网络服务器发送的一些配置信息和属性。我们就是用这个HTTP请求头来伪装成人类访问用户,以防止被服务器屏蔽。

如何构造合理的 HTTP请求头?

请求头可以通过“requests”模块自定义,例如

headers = {'User-Agent' :

'Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D)'

' AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19'}

headers = {'User-Agent': 'Chrome/68.0.3440.106',

'Accept-Encoding': 'gzip, deflate',

'Accept': '*/*',

'Connection': 'keep-alive',

'Content-Length': '18',

'Content-Type': 'application/x-www-form-urlencoded'}

经我亲身测试发现,HTTP请求头包含的这些内容里最为重要的是“User-Agent“这个参数。我们在设置请求头时,其实只需要设置好它就足够了。除了以上这个设置方法,还有一个较为简单的办法,那就是用python的fake_useragent模块来设置,示例代码如下:

#调用模块的UserAgent类方法

from fake_useragent import UserAgent

#实例化类方法

user_agent = UserAgent()

#选择chrome浏览器为User-Agent的值

headers = {'User-Agent':user_agent.chrome}

#选择ie浏览器为User-Agent的值

headers = {'User-Agent':user_agent.ie}

#选择firefox浏览器为User-Agent的值

headers = {'User-Agent':user_agent.firefox}

#随机选择一款浏览器为User-Agent的值

headers = {'User-Agent':user_agent.random}

请求头设置完之后,我们便可以进行下一步关键性的操作——爬取指定网页信息。

如何爬取指定网页的信息?

这次我们用到了requests模块中的get方法,requests.get(url , headers)。通过给get方法传递网址参数url和Http头信息headers便可以接收到网站的响应response,这个response里包含着整个网页的全部源代码。这里我们应该在代码中写好各种可能发生的情况,以此来提高代码运行时的稳定性,防止崩溃。示例代码如下:

from requests.exceptions import ReadTimeout

try:

response = requests.get(url, headers=headers, timeout=0.5)

if response.status_code == 200:

return response.text

return 404

except ReadTimeout:

print('timeout')

except Exception as e:

print(e)

示例中用的是python的异常处理标识符——try、except。首先导入了requests模块中的异常处理类型ReadTimeout,用来处理网站访问超时响应问题。其次Exception用来处理其他常规的问题。然后在判断response参数的status_code的值是否是200,这个值是200说明服务器响应成功了,如果不是,则返回404代码。表示404 NotFound服务器响应失败。到这一步,我们便完成了爬取网页信息的工作,接下来就是从这些网页代码里分析和获取有用信息。

如何从网页源码中获取有用的信息?

这里我们会用到re模块的两个方法,一个是re.findall( 模式(正则表达式), 目标字符串),返回值为list类型,另一个是re.sub(要替换的字符,替换后字符,目标字符串,替换个数),返回值为str类型。re.findall函数是通过指定的正则表达式来匹配出需要的HTML源码,一般情况下是匹配源码中的div容器,也就是类似“

import re

response = """

太阳太阳系的中心天体,占有太阳系总体质量的99.86%。
"""

partten = r'

([\s\S]*?)
'

data = re.findall(partten, response,)

print(data)

data_clean = re.sub(r'|', '', data[0])

print(data_clean)

输出结果为

['太阳太阳 系的中心天体,占有太阳系总体质量的99.86%。']

太阳是太阳系的中心天体,占有太阳系总体质量的99.86%。

第一行是findall函数的输出结果。从内容上看,我们已经获取了div容器里的内容,但是很明显,这里面掺杂着其他的标记语言。于是第二步sub函数将其中的标签替换成了空字符串。这行输出结果便是我们所需要的有用信息。

下面我们来尝试爬取京东官网的手机图片,以下是源码

import urllib.request

import re

from fake_useragent import UserAgent

import requests

from requests.exceptions import ReadTimeout

import os

user_agent = UserAgent()

headers = {

"User-Agent": user_agent.chrome,

}

def get_html(url, req=None):

if req:

url = url + req

else:

url = url

try:

response = requests.get(url, headers=headers)

if response.status_code == 200:

#print(response.text)

return response.text

return 404

except ReadTimeout:

print('timeout404')

except Exception as e:

print(e)

def get_request(response):

if response == 404:

return '服务器响应失败!'

else:

try:

partten = r''

data = re.compile(partten).findall(response)

return data

except IndexError:

print('未搜到有用信息')

def output(data):

if not os.path.exists('texts'):

os.mkdir('texts')

for index, inf in enumerate(data):

image_url = 'https://' + inf

image_byte = requests.get(url=image_url, headers=headers).content

with open("./texts/{}.jpg".format(index),'wb') as f:

f.write(image_byte)

print('\n第{}张图片已下载保存成功...'.format(index))

print('\n总共{}张图片已成功下载至texts文件夹中'.format(len(data)))

def main(req):

url = 'https://list.jd.com/list.html?cat=9987,653,655&page='

html = get_html(url, req)

data = get_request(html)

output(data)

if __name__ == '__main__':

req = input('请输入要下载的页码: ')

main(req)

程序运行之后,我们按照提示输入页码,程序便开始下载图片

下载完成之后,我们打开指定的文件夹查看一下效果

大功告成!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java排队系统模型,MMC排队系统模型

MMC排队系统模型及应用M/M/C排队模型及其应用摘要:将随机服务系统中M/M/C排队模型应用到理发服务行业中。通过对某理发店进行调查,以10min为一个调查单位调查顾客到达数,统计了72个调查单位的数据,又随机调查了113名顾客服务时间&…

php 如何生成微信小程序,微信小程序一键生成平台系统/一键生成小程序开源小程序PHP|ThinkPHP平台源码下载...

源码名称:微信小程序一键生成平台系统/一键生成小程序开源小程序PHP|ThinkPHP平台源码下载购买须知:(请仔细阅读了解)【1】源码一律经测试无误。【2】不提供任何修改和编辑服务,不包安装调试,假如你什么都不懂的请不要拍。【3】假…

python excel格式刷_Excel格式刷怎么用?没你想的那么简单,你知道几种用法?

【温馨提示】亲爱的朋友,阅读之前请您点击【关注】,您的支持将是我最大的动力!Excel使用过程中,格式刷相信小伙伴们都知道,平常也没少用。Excel中格式刷可以帮助我们快速的复制单元格的格式,而不用再重新设…

php接受post接受不到数据,PHP $_POST接受不到数据,但$_GET可以接受数据

"HTML ajax端 $.ajax({ url:/login.php, data:{name:name, pwd:pwd}, type:POST, dataType:json, success:function(data){ console.dir(data) if(data.status 1) alert(data.mes) }else{ alert(data.mes) } } })php端:$sql "SELECT * FROM user WHERE …

python安装多个版本_Mac安装多个python版本

Mac安装多个python版本步骤如下:1、安装pyenv$sudo brew install pyenv然后在 .bash_profile 文件中添加命令:vi .bash_profile添加:eval "$(pyenv init -)"最后,更新一下环境变量命令:source .bash_profile…

java .item,javabb-javaitem-cloud

JavaItem-Cloud项目介绍JavaItem-Cloud是一个新开发的微服务架构平台,基于最新流行的技术SpringBoot、SpringCloud & SpringCloud Alibaba、Vue、Vuex、ElementUI。系统特性后端使用当前流行技术,SpringBoot、SpringCloud、SpringCloud Alibaba、Myb…

软件使用手册模板_我的印象笔记使用手册(精简说明)

在之前的一文中,我已经详细写过我的印象笔记使用的方法了,这次呢,再做一个更新的使用情况和更清楚明了和精简的说明。不居竹:我的印象笔记使用手册​zhuanlan.zhihu.com文章目录:1、知识管理收集知识整理知识输出知识2…

java 响应事件,用java响应颜色事件

我正在构建一个java应用程序来解决难题 . 我编码的方式基本上是程序将采取屏幕截图,在屏幕截图中找到一个像素,并通过机器人功能将鼠标移动到桌面上的那个位置 . 我理解屏幕截图背后的理论,将其存储在一个数组中,探索数组直到一个…

怎样保存python源程序_五分钟教会你如何编写、保存与运行 Python 程序

第一步接下来我们将看见如何在 Python 中运行一个传统的“Hello World”程序。Python教程本章将会教你如何编写、保存与运行 Python 程序。通过 Python 来运行的你的程序有两种方法——使用交互式解释器提示符或直接运行一个源代码文件。我们将了解如何使用他们二者的功能。使用…

matlab实验8数据分析与多项式计算,hashidamatlab实验八数据处理与多项式计算.doc

实验八电子二班张秀云 一、实验目的〔据处理与多项式计算1、掌握数据统计和分析的方法2、掌握数值插值与曲线拟合的方法及其应用3、掌握多项式的常用运算二、实验内容1、利用MATLAB提供的rand函数生成30000个符合均匀分布的随机 数,然后检验随机数的性质&#xff1a…

微信群定时发消息 python_Python实现每天定时发微信问候语

IT学习乐园甄选优质技术文档,服务群众!作者:varlemon来源:https://www.cnblogs.com/connect/p/python-wechat-iciba.html图源:网络编辑:IT技术头条免责声明:1.本公众号所转载文章均来自公开网络…

php页面添加链接,怎么给一个PHP密码访问页面加超链接

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼$password "1234"; // 这里是密码$p "";if(isset($_COOKIE["isview"]) and $_COOKIE["isview"] $password){$isview true;}else{if(isset($_POST["pwd"])){if($_POST["…

python 硬件模拟_如何编写一个硬件模拟器?

当下是短视频的时代,随着5g进程的加速推动,短视频已经成为了很多自媒体人变现的主要途径B站,抖音,快手,西瓜视频等等各大平台都砸钱鼓励平台创作者创作视频,因为平台流量大,我们就可以通过一些技…

通信之道从微积分到5gpdf_保送清华成博士,华为12年搞通信,他为何如此看待 5G ?| 人物志...

作者 | 伍杏玲 胡巍巍出品 | CSDN(ID:CSDNnews)一位通信专家,清华读了博士,北大从事博士后研究工作,但却只有12年工作经历?明明家里几套房,却热爱骑车出行?他是?他是国内小有名气的通…

manifest php,Laravel PackageManifest.php: Undefined index: name

问题Im just trying to deploy my application and I just ran composer update on my server and I got the following error:In PackageManifest.php line 122:Undefined index: nameHow can I fix this issue?回答1:i had the same problem.In my case downgrading the com…

python使用spark-sql读取数据并可视化_使用Spark SQL读取HBase上的数据

近日,由华为团队开发的1、基于部分评估技术,该项目具有强大的数据剪枝和智能扫描特点;2、支持自定义过滤规则、协处理器等以便支持超低延迟的处理;3、支持SQL、DataFrame;4、支持更多的SQL(比如二级索引、布隆过滤、主…

mysql封装 javabean,利用Java针对MySql封装的jdbc框架类JdbcUtils完整实现(包含增删改查、JavaBean反射原理,附源码)...

最近看老罗的视频,跟着完成了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查。其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口:1、public Connection getConnection() 获得数据库的…

react实现异步插件_React-loadable实现组件进行异步加载

React 项目打包时,如果不进行异步组件的处理,那么所有页面所需要的 js 都在同一文件中(bundle.js),整个js文件很大,从而导致首屏加载时间过长.所有,可以对组件进行异步加载处理,可以使用 React-loadable实现…

python 二分法调试代码,Python实现二分法

Python实现二分查找为什么需要二分查找如果查找1-100内任意一个数字?顺序查找(简单查找)从1开始或者100倒着来进行查找最快只需要一次,但是最慢则需要一百次,差距相当大大O表示法为 O(n)二分查找每次从中间进行查找,先从50&#x…

云计算的发展趋势_2020年的云计算发展趋势预测

点击上方“蓝色字体”,选择 “设为星标”关键讯息,D1时间送达!SnapLogic公司首席技术官Craig Stewart表示,企业需要为不同的目的使用多个云平台,这将意味着多云应用的普及率将上升。在新的一年即将到来之际&#xff0c…