python爬虫爬取网页数据 python爬虫快速入门
大家好,今天给各位分享python爬虫爬取网页数据的一些知识,其中也会对python爬虫快速入门进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
python怎么爬取网页数据_python爬虫入门实战步骤
Python爬取网页数据及爬虫入门实战步骤Python爬取网页数据核心步骤为发出请求、解析内容、提取数据,入门实战主要围绕requests库和BeautifulSoup库展开,具体可分为以下几个阶段:
一、明确目标与初步侦察确定爬取目标:在开始编写代码前,需明确要抓取的数据内容,例如商品价格、新闻标题、评论信息等。使用浏览器开发者工具分析:打开目标网站,按下键盘上的 F12键,调出浏览器的开发者工具。
在开发者工具中,切换到 Elements选项卡,查看网页的HTML结构,找到目标数据所在的HTML元素位置。
切换到 Network选项卡,刷新页面,观察是否有 XHR类型的请求(通常用于动态加载数据)。如果有,说明部分数据可能是通过JavaScript动态加载的,需要进一步分析这些请求的URL、参数和返回的数据格式。
二、发送请求获取网页HTML安装requests库:如果尚未安装requests库,可以使用 pip install requests命令进行安装。使用requests库发送HTTP请求:导入requests库:import requests
发送GET请求获取网页内容:
url="目标网站的URL"response= requests.get(url)if response.status_code== 200: html_content= response.textelse: print(f"请求失败,状态码:{response.status_code}")-在上述代码中,`url`是要爬取的目标网页地址,`requests.get(url)`发送GET请求,`response.status_code`用于检查请求是否成功(状态码为200表示成功),`response.text`获取网页的HTML内容。三、解析HTML并提取所需数据安装BeautifulSoup库:使用 pip install beautifulsoup4命令安装BeautifulSoup库,同时建议安装 lxml解析器(pip install lxml),它具有较快的解析速度。使用BeautifulSoup解析HTML:导入BeautifulSoup库:from bs4 import BeautifulSoup
创建BeautifulSoup对象:
soup= BeautifulSoup(html_content,'lxml')-这里 `html_content`是前面通过requests库获取的HTML内容,`'lxml'`指定使用lxml解析器。提取所需数据:通过标签名提取:例如提取所有的<a>标签,可以使用 soup.find_all('a')。
通过类名提取:如果目标元素有特定的类名,可以使用 soup.find_all(class_='类名')。
通过ID提取:若目标元素有唯一的ID,可以使用 soup.find(id='ID名')。
提取文本内容:对于找到的HTML元素,可以使用.text属性获取其文本内容。例如,如果找到了一个包含新闻标题的<h1>标签,可以使用 title= h1_element.text获取标题文本。
四、制定爬取策略(针对动态加载数据)分析动态加载请求:如果在初步侦察阶段发现数据是通过JavaScript动态加载的,需要在 Network选项卡中找到对应的 XHR请求。模拟动态加载请求:查看该请求的URL、请求方法(GET或POST)、请求头(Headers)和请求参数(Params或Form Data)。
使用requests库模拟该请求,例如:
dynamic_url="动态加载数据的URL"headers={"User-Agent":"你的浏览器User-Agent",#其他可能的请求头信息}params={"参数名1":"参数值1","参数名2":"参数值2"#其他参数}dynamic_response= requests.get(dynamic_url, headers=headers, params=params)if dynamic_response.status_code== 200: dynamic_data= dynamic_response.json()#如果返回的是JSON格式数据#进一步处理动态数据else: print(f"动态数据请求失败,状态码:{dynamic_response.status_code}")五、完整示例代码import requestsfrom bs4 import BeautifulSoup#明确目标URLurl="替换为实际目标网站#发送请求获取网页HTMLresponse= requests.get(url)if response.status_code== 200: html_content= response.text#解析HTML soup= BeautifulSoup(html_content,'lxml')#提取所需数据,例如提取所有的<a>标签的文本和链接 links= soup.find_all('a') for link in links: text= link.text href= link.get('href') print(f"文本:{text},链接:{href}")else: print(f"请求失败,状态码:{response.status_code}")通过以上步骤,就可以完成一个简单的Python网页数据爬取任务。在实际应用中,还需要注意遵守网站的robots协议,避免过度请求对网站造成负担。
如何用 Python 爬取需要登录的网站
最近我必须执行一项从一个需要登录的网站上爬取一些网页的操作。它没有我想象中那么简单,因此我决定为它写一个辅助教程。
在本教程中,我们将从我们的bitbucket账户中爬取一个项目列表。
教程中的代码可以从我的Github中找到。
我们将会按照以下步骤进行:
提取登录需要的详细信息
执行站点登录
爬取所需要的数据
在本教程中,我使用了以下包(可以在requirements.txt中找到):
Python
1
2
requests
lxml
步骤一:研究该网站
打开登录页面
进入以下页面“bitbucket.org/account/signin”。你会看到如下图所示的页面(执行注销,以防你已经登录)
仔细研究那些我们需要提取的详细信息,以供登录之用
在这一部分,我们会创建一个字典来保存执行登录的详细信息:
1.右击“Username or email”字段,选择“查看元素”。我们将使用“name”属性为“username”的输入框的值。“username”将会是 key值,我们的用户名/电子邮箱就是对应的 value值(在其他的网站上这些 key值可能是“email”,“ user_name”,“ login”,等等)。
2.右击“Password”字段,选择“查看元素”。在脚本中我们需要使用“name”属性为“password”的输入框的值。“password”将是字典的 key值,我们输入的密码将是对应的 value值(在其他网站key值可能是“userpassword”,“loginpassword”,“pwd”,等等)。
3.在源代码页面中,查找一个名为“csrfmiddlewaretoken”的隐藏输入标签。“csrfmiddlewaretoken”将是 key值,而对应的 value值将是这个隐藏的输入值(在其他网站上这个 value值可能是一个名为“csrftoken”,“authenticationtoken”的隐藏输入值)。列如:“Vy00PE3Ra6aISwKBrPn72SFml00IcUV8”。
最后我们将会得到一个类似这样的字典:
Python
1
2
3
4
5
payload={
"username":"<USER NAME>",
"password":"<PASSWORD>",
"csrfmiddlewaretoken":"<CSRF_TOKEN>"
}
请记住,这是这个网站的一个具体案例。虽然这个登录表单很简单,但其他网站可能需要我们检查浏览器的请求日志,并找到登录步骤中应该使用的相关的 key值和 value值。
步骤2:执行登录网站
对于这个脚本,我们只需要导入如下内容:
Python
1
2
import requests
from lxml import html
首先,我们要创建session对象。这个对象会允许我们保存所有的登录会话请求。
Python
1
session_requests= requests.session()
第二,我们要从该网页上提取在登录时所使用的 csrf标记。在这个例子中,我们使用的是 lxml和 xpath来提取,我们也可以使用正则表达式或者其他的一些方法来提取这些数据。
Python
1
2
3
4
5
login_url="n/?next=/"
result= session_requests.get(login_url)
tree= html.fromstring(result.text)
authenticity_token= list(set(tree.xpath("//input[@name='csrfmiddlewaretoken']/@value")))[0]
**更多关于xpath和lxml的信息可以在这里找到。
接下来,我们要执行登录阶段。在这一阶段,我们发送一个 POST请求给登录的 url。我们使用前面步骤中创建的 payload作为 data。也可以为该请求使用一个标题并在该标题中给这个相同的 url添加一个参照键。
Python
1
2
3
4
5
result= session_requests.post(
login_url,
data= payload,
headers= dict(referer=login_url)
)
步骤三:爬取内容
现在,我们已经登录成功了,我们将从bitbucket dashboard页面上执行真正的爬取操作。
Python
1
2
3
4
5
url='/overview'
result= session_requests.get(
url,
headers= dict(referer= url)
)
为了测试以上内容,我们从 bitbucket dashboard页面上爬取了项目列表。我们将再次使用 xpath来查找目标元素,清除新行中的文本和空格并打印出结果。如果一切都运行 OK,输出结果应该是你 bitbucket账户中的 buckets/ project列表。
Python
1
2
3
4
5
tree= html.fromstring(result.content)
bucket_elems= tree.findall(".//span[@class='repo-name']/")
bucket_names= [bucket.text_content.replace("n","").strip() for bucket in bucket_elems]
print bucket_names
你也可以通过检查从每个请求返回的状态代码来验证这些请求结果。它不会总是能让你知道登录阶段是否是成功的,但是可以用来作为一个验证指标。
例如:
Python
1
2
result.ok#会告诉我们最后一次请求是否成功
result.status_code#会返回给我们最后一次请求的状态
Python网页解析库:用requests-html爬取网页
Python中可以进行网页解析的库有很多,常见的有 BeautifulSoup和 lxml等。在网上玩爬虫的文章通常都是介绍 BeautifulSoup这个库,我平常也是常用这个库,最近用 Xpath用得比较多,使用 BeautifulSoup就不大习惯,很久之前就知道 Reitz大神出了一个叫 Requests-HTML的库,一直没有兴趣看,这回可算歹着机会用一下了。
使用 pip install requests-html安装,上手和 Reitz的其他库一样,轻松简单:
这个库是在 requests库上实现的,r得到的结果是 Response对象下面的一个子类,多个一个 html的属性。所以 requests库的响应对象可以进行什么操作,这个 r也都可以。如果需要解析网页,直接获取响应对象的 html属性:
不得不膜拜 Reitz大神太会组装技术了。实际上 HTMLSession是继承自 requests.Session这个核心类,然后将 requests.Session类里的 requests方法改写,返回自己的一个 HTMLResponse对象,这个类又是继承自 requests.Response,只是多加了一个 _from_response的方法来构造实例:
之后在 HTMLResponse里定义属性方法 html,就可以通过 html属性访问了,实现也就是组装 PyQuery来干。核心的解析类也大多是使用 PyQuery和 lxml来做解析,简化了名称,挺讨巧的。
元素定位可以选择两种方式:
方法名非常简单,符合 Python优雅的风格,这里不妨对这两种方式简单的说明:
定位到元素以后势必要获取元素里面的内容和属性相关数据,获取文本:
获取元素的属性:
还可以通过模式来匹配对应的内容:
这个功能看起来比较鸡肋,可以深入研究优化一下,说不定能在 github上混个提交。
除了一些基础操作,这个库还提供了一些人性化的操作。比如一键获取网页的所有超链接,这对于整站爬虫应该是个福音,URL管理比较方便:
内容页面通常都是分页的,一次抓取不了太多,这个库可以获取分页信息:
结果如下:
通过迭代器实现了智能发现分页,这个迭代器里面会用一个叫 _next的方法,贴一段源码感受下:
通过查找 a标签里面是否含有指定的文本来判断是不是有下一页,通常我们的下一页都会通过下一页或者加载更多来引导,他就是利用这个标志来进行判断。默认的以列表形式存在全局: ['next','more','older']。我个人认为这种方式非常不灵活,几乎没有扩展性。感兴趣的可以往 github上提交代码优化。
也许是考虑到了现在 js的一些异步加载,这个库支持 js运行时,官方说明如下:
使用非常简单,直接调用以下方法:
第一次使用的时候会下载 Chromium,不过国内你懂的,自己想办法去下吧,就不要等它自己下载了。render函数可以使用 js脚本来操作页面,滚动操作单独做了参数。这对于上拉加载等新式页面是非常友好的。
关于本次python爬虫爬取网页数据和python爬虫快速入门的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。