1爬虫练习(urllib+xpath)

爬取某公司官网新闻中心板块(“http://www.tipdm.com/xwzx/index.jhtml”)中的新闻标题和新闻内容,爬取页数为5页。 要求:使用urllib库实现HTTP请求的发送,使用Xpath进行网页解析,最后将爬取到的内容保存至Excel文件中。

1.1第一页数据的爬取

#导入相应库
from urllib import request
from lxml import etree
import pandas as pd #安装命令:pip install pandas -i http://pypi.douban.com/simpleurl = 'http://www.tipdm.com/xwzx/index.jhtml' #第一页的网页链接
#发送请求
req = request.Request(url)
#打开响应的对象
response = request.urlopen(req)
#获取响应的内容
html = response.read()#解析网页
html = etree.HTML(html)
#获取数据
title = html.xpath('//*[@id="t505"]/div/div[3]/h1/a/text()') #新闻标题
content = html.xpath('//*[@id="t505"]/div/div[3]/div/text()') #新闻内容#将数据存储为数据框DataFrame
data = pd.DataFrame({'新闻标题':title, '新闻内容':content})
#将数据保存为Excel文件
data.to_excel(r'F:\Desktop\data.xlsx')

1.2多页数据的爬取

思路:首先把所有的网页链接存放到一个列表中,然后循坏这一个网页链接列表中的每一个链接,向每一个链接发送请求、网页解析、获取数据。此时获取到的数据只是单个页面的数据,所以需要在循坏外构建一个空的DataFrame用于存放所有页面的数据。最后将这个包含有总数据的DataFrame保存为excel文件。

#导入相应的库
from urllib import request
from lxml import etree
import pandas as pd#获取前5页网页链接
urls = [] #构建空列表存放网页链接
for i in range(1, 6):u = 'http://www.tipdm.com/xwzx/index_'+ str(i) + '.jhtml'urls.append(u) #向列表添加一个一个的链接
urls#获取前5页的网页内容
all_data = pd.DataFrame() #构建空的DataFrame
for j in urls:#发送请求req = request.Request(j)#打开响应的对象response = request.urlopen(req)#获取响应的内容html = response.read()#解析网页html = etree.HTML(html)#获取数据title = html.xpath('//*[@id="t505"]/div/div[3]/h1/a/text()') #新闻标题content = html.xpath('//*[@id="t505"]/div/div[3]/div/text()') #新闻内容#将数据存储为数据框DataFramedata = pd.DataFrame({'新闻标题':title, '新闻内容':content})#数据纵向合并all_data = pd.concat([all_data, data], axis=0)#将全部数据保存为Excel文件
all_data.to_excel(r'F:\Desktop\all_data.xlsx')

2requests库实现HTTP请求

requests库生成请求的代码非常便利,其使用的request方法的语法格式如下:

requests.get(url,**kwargs)

2.1发送请求

import requests #安装命令:pip install requests -i http://pypi.douban.com/simple --trusted-host pypi.douban.comrq = requests.get('http://www.tipdm.com/')
print('响应码:', rq.status_code) #返回200,表示访问成功
print('编码:', rq.encoding)
print('获取内容:', rq.text)
print('获取内容:', rq.content) #二进制文本呈现

2.2乱码情况

#设置乱码
rq.encoding = 'gbk'
print('获取内容:', rq.text)
print('获取内容:', rq.content)

2.2.1乱码修改第一种方法:手动指定

可以直接查看网页源码中的charset属性得到该网页的编码。

##针对text输出
rq.encoding = 'UTF-8'
print('获取内容:', rq.text)##针对content输出,需要使用decode进行解码
print('获取内容:', rq.content.decode('utf-8'))

2.2.2乱码修改第二种方法:自动检测

chardet库是一个非常优秀的字符串∕文件编码检测模块。chardet库使用detect方法检测给定字符串的编码,detect方法常用的参数及其说明如下。

#重新设置以乱码形式呈现
rq.encoding = 'gbk'
print('获取内容:', rq.text)
import chardet #安装命令:pip install chardet -i http://pypi.douban.com/simple --trusted-host pypi.douban.comrq.encoding = chardet.detect(rq.content)['encoding'] #chardet.detect(rq.content)返回的是字典形式的数据
print('获取内容:', rq.text) #修改成功

2.3爬虫练习requests+xpath

import requests
from lxml import etree
import pandas as pd#获取前5页网页链接
urls = [] #构建空列表存放网页链接
for i in range(1, 6):u = 'http://www.tipdm.com/xwzx/index_'+ str(i) + '.jhtml'urls.append(u) #向列表添加一个一个的链接#获取前5页的网页内容
all_data = pd.DataFrame() #构建空的DataFrame
for j in urls:#发送请求rq = requests.get(j)#解析网页html = etree.HTML(rq.text)#获取数据title = html.xpath('//*[@id="t505"]/div/div[3]/h1/a/text()') #新闻标题content = html.xpath('//*[@id="t505"]/div/div[3]/div/text()') #新闻内容#将数据存储为数据框DataFramedata = pd.DataFrame({'新闻标题':title, '新闻内容':content})#数据纵向合并all_data = pd.concat([all_data, data], axis=0)#将全部数据保存为Excel文件
all_data.to_excel(r'F:\Desktop\all_data.xlsx')

3使用Beautiful Soup解析网页

Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库。目前Beautiful Soup 3已经停止开发,大部分的爬虫选择使用Beautiful Soup 4开发。Beautiful Soup不仅支持Python标准库中的HTML解析器,还支持一些第三方的解析器,具体语法如下。

lxml解析器比较常用。

3.1创建BeautifulSoup对象

要使用Beautiful Soup库解析网页首先需要创建BeautifulSoup对象,将字符串或HTML文件传入。

创建一个BeautifulSoup对象,使用格式如下。

BeautifulSoup("<html>data</html>")     #通过字符串创建
BeautifulSoup(open("index.html"))       #通过HTML文件创建import requests
from bs4 import BeautifulSoup #pip install beautifulsoup4 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com#requests发送请求
rq = requests.get('http://www.tipdm.com/')
#BeautifulSoup实现网页解析
soup = BeautifulSoup(rq.text, 'lxml') #'lxml'表解析器

3.2对象类型

3.2.1Tag对象类型

(1)Tag对象为HTML文档中的标签,形如

“<title>The Dormouse's story</title>”或“<p class="title"><b>The Dormouse's story</b></p>”

等HTML标签再加上其中包含的内容便是Beautiful Soup中的Tag对象。

(2)通过Tag的名称属性可以很方便的在文档树中获取需要的Tag对象,通过该方法只能获取文档树中第一个同名的Tag对象,而通过多次调用可获取某个Tag对象下的分支Tag对象。通过find_all方法可以获取文档树中的全部同名Tag对象。

soup.head #返回head标签内容
soup.title #返回title标签内容
soup.body.li #返回的是第一个li标签
soup.find_all('li') #可返回所有li标签
type(soup.head) #bs4.element.Tag

(3)Tag有两个非常重要的属性:name和attributes。name属性可通过name方法来获取和修改,修改过后的name属性将会应用至BeautifulSoup对象生成的HTML文档。

a = soup.link
a.name #name属性返回的是标签名称
a.attrs #attrs属性返回的是该标签下面的属性和属性值

3.2.2NavigableString对象类型NavigableString对象为包含在Tag中的文本字符串内容,如

“<title>The Dormouse‘s story</title>”中的“The Dormouse’s story”

使用string的方法获取,NavigableString对象无法被编辑,但可以使用replace_with的方法进行替换。

soup.title.string #可获取到title标签的文本内容
type(soup.title.string) #bs4.element.NavigableString#更改标签里的文本内容
a = soup.title.string
a.replace_with('广东泰迪科技股份有限公司') #替换
soup.title.string 

3.2.3BeautifulSoup对象类型

BeautifulSoup对象表示的是一个文档的全部内容。大部分时候,可以把它当作Tag对象。 BeautifulSoup对象并不是真正的HTML或XML的tag,所以并没有tag的name和attribute属性,但其包含了一个值为“[document]”的特殊属性name。

type(soup) #bs4.BeautifulSoup
soup.name #只返回[document]值
soup.attrs #BeautifulSoup对象类型没有attribute属性

3.2.4Comment对象类型

Tag、NavigableString、BeautifulSoup几乎覆盖了html和xml中的所有内容,但是还有一些特殊对象,文档的注释部分是最容易与Tag中的文本字符串混淆的部分。Beautiful Soup库中将文档的注释部分识别为Comment类型,Comment对象是一个特殊类型的NavigableString对象,但是当其出现在HTML文档中时,Comment对象会使用特殊的格式输出,需调用prettify方法。

markup = '<c><!--This is a markup--></b>'
markup_soup = BeautifulSoup(markup, 'lxml')
markup_soup.c.string
type(markup_soup.c.string) #bs4.element.Comment

3.3搜索特定节点并获取其中的链接及文本

Beautiful Soup定义了很多搜索方法,其中常用的有find方法和find_all方法,两者的参数一致,区别为find_all方法的返回结果是值包含一个元素的列表,而find直接返回的是结果。find_all方法用于搜索文档树中的Tag非常方便,其语法格式如下。

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

find_all方法的常用参数及其说明如下。

find_all方法

(1)可通过多种参数遍历搜索文档树中符合条件的所有子节点。

(2)可通过name参数搜索同名的全部子节点,并接收多种过滤器。

(3)按照CSS类名可模糊匹配或完全匹配。完全匹配class的值时,如果CSS类名的顺序与实际不符,将搜索不到结果。

(4)若tag的class属性是多值属性,可以分别搜索tag中的每个CSS类名。

(5)通过字符串内容进行搜索符合条件的全部子节点,可通过过滤器操作。

(6)通过传入关键字参数,搜索匹配关键字的子节点。

import requests
from bs4 import BeautifulSoup #pip install beautifulsoup4#requests发送请求
rq = requests.get('http://www.tipdm.com/')
#BeautifulSoup实现网页解析
soup = BeautifulSoup(rq.text, 'lxml') #'lxml'表解析器soup.find_all('title') #返回的是列表
soup.find('title') #直接返回结果#获取标签内容,使用get_text()方法
soup.find_all('title')[0].get_text()
soup.find('title').get_text()soup.find('nav', class_="nav").find('ul', id="menu").find_all('li')[0].find('a').get_text() #class_ 这里加一个下划线是因为避免与python关键字冲突所以用一个下划线.

Phython—实训day5—爬虫相关知识相关推荐

  1. 创新实训-python爬虫多线程|解决中文乱码问题|卡片向上浮动效果|图文切换

    创新实训-python爬虫多线程|乱码问题|前端样式重新修改 考完毛概,把上周的工作总结一下.爬虫在第一周的时候只爬了一个就业指导这一个模块,这一次又加了招聘服务模块,所以就用了两个线程.前端首页一开 ...

  2. 实训一计算机基础知识,《计算机基础知识与操作技能》实训指导与习题解析

    模块一 计算机基础知识 1 习题解析 1 练习题 4 模块二 Windows XP系统 7 项目一 Windows XP的基本操作 7 任务一 认识Windows XP桌面 7 任务二 设置" ...

  3. 实训项目计算机基础知识实训报告,计算机应用基础(本)形考作业实训2学习实训报告.docx...

    <计算机应用基础(本)形考作业实训2学习实训报告.docx>由会员分享,提供在线免费全文阅读可下载,此文档格式为docx,更多相关<计算机应用基础(本)形考作业实训2学习实训报告.d ...

  4. 使用计算机写作与手工写作的异同,会计模拟论文,关于中等职业学校会计模拟实训课程存在相关参考文献资料-免费论文范文...

    导读:本论文是一篇免费优秀的关于会计模拟论文范文资料. 摘 要:当前的会计模拟实训主要是通过写.算.做三项基本功的独立操作进行的,但存在着诸多问题,就中职学校会计模拟实训课程的完善建议进行了探讨. 关 ...

  5. python 静态网页_Python静态网页爬虫相关知识

    想要开发一个简单的Python爬虫案例,并在Python3以上的环境下运行,那么需要掌握哪些知识才能完成一个简单的Python爬虫呢? 爬虫的架构实现 爬虫包括调度器,管理器,解析器,下载器和输出器. ...

  6. 计算机微机组装实训报告,微机组装实训报告_相关文章专题_写写帮文库

    时间:2019-05-12 08:39:04 作者:admin 计算机组装与维护实训报告 班 级: 姓 名: 学 号: 指导老师: 二〇一四年六月 微机组装与维护实训报告 一.实训目的 1.能够将零散 ...

  7. 分布式网络爬虫关键技术分析与实现一网络爬虫相关知识介绍

    搜索引擎发展的历史过程与发展现状 1搜索引擎的发展的历史 1990年以前,没有任何人能搜索互联网.所有搜索引擎的祖先,是1990年由Montreal的McGill University学生Alan E ...

  8. Python—实训day4—爬虫案例3:贴吧图片下载

    6 xpath 首先需要安装Google的Chrome浏览器 6.1 安装xpath插件 把 xpath_helper_2_0_2.crx 修改后缀名为 xpath_helper_2_0_2.rar. ...

  9. Python—实训day2—爬虫案例1:访问百度贴吧

    2 爬虫案例1:访问百度贴吧 假设我们要访问的贴吧是:动漫吧 头几页的URL地址为: https://tieba.baidu.com/f?kw=%E5%8A%A8%E6%BC%AB&ie=ut ...

最新文章

  1. 高煥堂 5本 Android 的 eBooks (完整版Free)
  2. Verilog设计实例(3)基于Verilog的单端口同步读写RAM设计
  3. __getitem__()
  4. Spring @transactional annotation 事务使用详解
  5. P1600 天天爱跑步
  6. 美团数据库运维自动化系统构建之路
  7. Exchange Server2013 系列七:客户端访问服务器高可用性部署实战
  8. 黄聪:HBuilder左侧项目管理器如何不与标签页一起自动切换
  9. java calendar 时分秒_Java中Calendar类的常用方法(对时间进行计算的类)
  10. Python模拟登录的几种方法
  11. Idea安装Eslint插件详解 提示:Plugin NativeScript was not installed解决
  12. 【MM32F5270开发板试用】硬件IIC读取SHT20温湿度传感器
  13. 怎么将图片转换成word文档?图片转word其实很简单
  14. 64位的系统最大可以支持多大内存
  15. less和css的区别是什么
  16. 浅谈二维码门禁在互联网的时代特色
  17. Elastic:运用 Elastic Maps 实时跟踪,可视化资产分布及地理围栏告警(二)
  18. Python和Matlab生成图片到visio的矢量图
  19. MATLAB中deg2rad和rad2deg函数的使用
  20. 数据库可移植性重要吗?

热门文章

  1. 3d vision可以卸载吗_金属粉末可以用于3D打印,但这些知识你了解吗?
  2. 卧槽,柠檬也能做汽车???
  3. ​在电网工作,有多高大上?
  4. 干货 | 双目摄像头实现手势识别,完美还原人体运动手势
  5. C语言中三块“难啃的硬骨头”
  6. 5G时代到来,是机遇还是灾难?
  7. 字典与集合_月隐学python第8课
  8. 冒险岛sf发布网广告_魔域sf游戏怎么选择合适又放心的服务器?
  9. ios开发跳转safari_阻止iOS Web APP中点击链接跳转到Safari 浏览器新标签页
  10. html head 全局变量,Javascript全局变量的使用方法