学习笔记
PS:为啥这个BLOG是案例2,但是我的BLOG里没有案例1,那是因为BLOG1被锁了。心痛。


爬取新闻标题和链接

我想通过Xpath拿到X凰X闻[http://news.ifeng.com/]里的的3条新闻的标题和新闻详情链接该咋整呢?

我们先看看网页源代码:

我们看到我们想拿到的3条新闻标题都在一个ul标签中,ul标签有4个li子节点,每个li节点是一个消息块。

注意,这里明明有4个li节点,但为啥我们只爬取3条新闻的信息呢?因为其中有一个li节点包裹的是广告!!

我们看到,这个包裹着广告的li节点的HTML属性值和结构(截图没有体现出来,但大家可以自己去看)和其他包裹着新闻的li节点很不一样。

在包裹新闻的3个li节点中,均有一个a节点,这个a节点里包含着新闻详情链接,以及新闻标题。由此,我们可以通过这些信息,来思考怎么写Xpath语句了。

注意:我们得到的新闻详情链接[//news.ifeng.com/c/7vNA0WtAcHg]依然是不完整的,没有因特网服务类型(http:),所以在之后的python代码中,我们要自己加上去。

这里因为只是学习Xpath匹配,所以就直接把HTML源代码copy下来,放在一个txt文件夹里(html_data.txt),再通过python读取,并匹配,最后将匹配结果存到mysql数据库中。

查看我们的mysql数据库中的news_table数据表:

不过多解释了,直接开始编写python代码。但是注意!如果读取数据文件文件时,向下面这样写,可能会报UnicodeDecodeError错误:

with open('html_data.txt', 'r') as f:html = f.read()

这时,我们可以用二进制读取方式进行读取,再用utf-8编码格式,进行解码。

完整代码如下:

# -*- coding: utf-8 -*-from lxml import etree
import pymysqlclass FenghuangXpath:def __init__(self):self.db = pymysql.connect(host = '127.0.0.1',port = 3306,user = 'root',password = '19970928',database = 'datacup',charset = 'utf8')self.cur = self.db.cursor() def get_page(self):with open('html_data.txt', 'rb') as f:html = f.read().decode('utf-8')self.parse_page(html)def parse_page(self, html):link_xpath = \
'//ul[@class="news-stream-basic-news-list"]/li[@class="news-stream-newsStream-news-item-has-image clearfix news_item"]//h2/a/@href'name_xpath = \
'//ul[@class="news-stream-basic-news-list"]/li[@class="news-stream-newsStream-news-item-has-image clearfix news_item"]//h2/a/text()'parse_html = etree.HTML(html)link_list = parse_html.xpath(link_xpath)link_list = ['http:{}'.format(i) for i in link_list]name_list = parse_html.xpath(name_xpath)data_zip = zip(name_list, link_list)self.write_data(data_zip)def write_data(self, data_zip):sql = 'insert into news_table(name, news_link) \values(%s, %s);'try:self.cur.executemany(sql, data_zip)self.db.commit()except Exception as e:self.db.rollback()print('错误信息:', e)def main(self):self.get_page()self.cur.close()self.db.close()if __name__ == '__main__':fengh = FenghuangXpath()fengh.main()

查看news_table数据表内的数据:

很好,都导入了!
但是知道为啥id不是从1开始么?因为我在创建news_table表时,设置id为主键且自动增大。此时,我们就算不传输id值,mysql也会自动帮我们填好id值。那这和id为7有啥关系呢?那是因为博主以为偷懒,在利用python传数据时只传递了name和news_link字段,id字段让mysql自动帮博主填写了。

所以,当3条新闻记录第1次导入news_table时,id的确是从1开始的,但是由于博主是个傻子,代码敲错了n次,导致传入的记录总是不符合要求,所以博主不停的把mysql数据库里news_table表里的数据删了又删,直至第3次,导入的数据终于符合要求了,但是此时mysql给我们传入的id值就是从7开始排列了。悲伤的故事。。。

利用python爬虫(案例2)--X凰的一天相关推荐

  1. 利用python爬虫(案例8)--今天就是吃X我也要搞到有道

    学习笔记 备注:这个Blog也是part14 爬取有道 写个案例,我想要破解有道翻译(http://fanyi.youdao.com/)接口,抓取翻译结果. 一开始,我还以为写这个不是很麻烦,因为2年 ...

  2. 利用python爬虫(案例7)--X讯招聘的小职位们

    学习笔记 爬取X讯招聘的小职位们 写个小案例,我们想爬取X讯招聘网站里处于1级页面的职位名称和处于2级页面的工作职责和工作要求.由于这个X讯招聘网站是动态加载的,所以需要抓取我们与网站进行交互时产生的 ...

  3. 利用python爬虫(案例6+part14)--如何爬取科研数据

    学习笔记 文章目录 Ajax动态加载网站数据抓取 动态加载的类型 那么该如何抓取数据? 如何得到JSON文件的地址? 观察JSON文件URL地址的查询参数 JSON格式数据转换成python字典 如何 ...

  4. 利用python爬虫(案例5)--X刺代理的小IP们

    学习笔记 爬取X刺代理的小IP们 学完代理,我们发现网上找的很多免费代理IP都用不了,所以这里写一个简单的测试小案例,爬取一下某代理IP网站的免费代理IP,再遍历测试到底这些代理IP能不能用,哪些能用 ...

  5. 利用pyhton爬虫(案例4)--你想要的图片都在这

    学习笔记 爬取X度某吧里的小图片们 写个小案例,获取X度里,你指定的吧里,第kkk页之前所有帖子内的图片,当然这个kkk由你定. 爬取步骤 ①获取用户指定吧名和指定页数,得到贴吧主页URL. ②获取1 ...

  6. python爬虫怎么赚钱-个人利用Python爬虫技术怎么挣钱-10万被动收入...

    我利用Python爬虫技术年挣10万被动收入的方式,在正式聊Python爬虫技术之前,先来说说挣钱的事,说说作为一个自由职业或兼职者怎么利用爬虫来挣钱. 个人爬虫挣钱方法大致如下 爬虫技术挣钱方法1: ...

  7. Python 爬虫案例(二)--附件下载

    Python 爬虫案例(二) 此篇文章将爬取的网站是:http://www.warrensburg-mo.com/Bids.aspx (有时候打开不一定会有标书,因为标书实时更新) 类型跟上一篇相似, ...

  8. 利用python爬虫与数据分析,打造最强玩法,轻松成为大神级玩家!

    前言: 最近迷上了一款游戏,但是作为一名程序员的我是不可能只玩游戏的,我必须把它的官网数据采集下来! 环境: windows python3.6.5 模块: requests jsonpath pyg ...

  9. python爬虫简单实例-最简单的Python爬虫案例,看得懂说明你已入门,附赠教程

    原标题:最简单的Python爬虫案例,看得懂说明你已入门,附赠教程 这是最简单的Python爬虫案例,如果你能看懂,那么请你保持信心,因为你已经入门Python爬虫,只要带着信心和努力,你的技术能力在 ...

最新文章

  1. Confluence 6 从你的 JDBC 连接中直接启用校验查询
  2. Vivado IP核的综合模式:Global以及Out of context的区别理解
  3. 系统自动化安装kickstart
  4. Vue中使用Axios传递数组参数给SpringBoot后台时的实现方式
  5. spring代码异常捕获到logback logging.config=logback-spring.xml文件中不能输出异常e.printStackTrace...
  6. r语言做绘制精美pcoa图_R语言统计与绘图:绘制QQ图
  7. 用conda安装虚拟的R环境
  8. FreeSql (三)实体特性
  9. 超过响应缓冲区限制_Nginx如何限制并发连接数和连接请求数?
  10. iOS - Swift NSRect 位置和尺寸
  11. 白话Word2Vec
  12. Delphi Sql语句中值的引用
  13. 你关注过浏览器最小字体为多大吗?
  14. 什么是DIMM插槽?
  15. android+嵌入地图,Android 给app加入百度地图
  16. 前端JS计算文件MD5
  17. Kali报错SIOCSIFFLAGS:不允许的操作 解决办法
  18. 8266+DS3231时钟之显示TM1638的使用【四】下
  19. linux获取时间戳精确到毫秒,微妙
  20. 【HTML】表格标签,map,iframe,h5标签,语义化,标签分类,role,aria-*

热门文章

  1. 大话数据结构08:共享栈 C++
  2. 深度学习(四十五)——Stack GAN, GAN Ensemble, Pix2Pix, CycleGAN
  3. unity图片拖不进去_Unity UGUI实现简单拖拽图片功能
  4. python开发自动化创建一个任务下发到手机_如何利用Fabric自动化你的任务
  5. linux 下使用 tc 模拟网络延迟和丢包
  6. 2015级C++第2周实践项目
  7. Windows下VTK6.0.0安装详解(CMake使用说明)
  8. python-base64编码与解码
  9. /proc/sys/net/ipv4详解(2)
  10. 使用MyEclipse简单调用WebServices