爬取思路:爬取http://www.jokeji.cn/,得到一个html页面,分析此html页面,获得分类框里的所有分类的url地址,遍历每一个分类的url,爬取分类url的html网页,分析分类url网页,得到全部笑话网页列表,遍历笑话网页列表url,得到最终的包含一个一个笑话的html页面,获取笑话,存储到mysql数据库。

爬取我用的是Google浏览器,在这个网站下按F12就可以看到网页源代码了,此时要分析这个笑话大全的分类框的结构,以便使用python正则表达式获取到我们想要的信息。

一般筛选内容都会选择目标内容组件的上层容易唯一标识的组件,在这里我选择了<div class=”joketype l_left”>这个html,这个div可以包含所有分类的内容,然后再进行一次筛选就可以把所有url筛选出来了。到了分类子页面我看了一下url的规律,这个分类的url都是/listXX_1.htm开始,发现分类页面里面有个尾页的按钮的url刚好是结束,并且url的.htm前面的那个数字递增,所以就很好爬取所有笑话页面了,至于提取笑话就不再多说了,直接上所有代码。

mysql数据库存储模块代码,文件名为mysql.py。

import pymysqldef insert(joke):#获取链接conn=pymysql.connect(host='127.0.0.1',user='root',passwd='123456',db='python')cur=conn.cursor()#sql语句,%s是占位符(%s是唯一的,不论什么数据类型都使用%s)防止sql注入sql='insert into joke(joke) VALUES(%s)'#params=('eric','wuhan') #参数 插入单条#li=[('a1','b1'),('a2','b2')] #批量插入参数#reCount=cur.execute(sql,params)reCount=cur.executemany(sql,joke) #批量插入conn.commit() #提交,执行多条命令只需要commit一次就可以cur.close()conn.close()def get_one():#获取链接conn=pymysql.connect(host='127.0.0.1',user='root',passwd='123456',db='python')cur=conn.cursor()sql1='select number from number'reCount=cur.execute(sql1)number=cur.fetchone()[0]+1sql2='select joke from joke where id=%s'reCount=cur.execute(sql2,number)joke=cur.fetchone()[0]sql3='update number set number=%s where number=%s'params=(number,number-1)reCount=cur.execute(sql3,params)conn.commit()cur.close()conn.close()

爬虫代码,文件名为spider.py。

import urllib
from urllib import request
import re
import chardet
import mysql
import time
'''
找到http://www.jokeji.cn/list29_1.htm笑话列表
获取第一个笑话网页http://www.jokeji.cn/jokehtml/bxnn/2018080417455037.htm
遍历完所有笑话网页
获取下一个笑话列表,重复遍历,直至此分类笑话遍历完
遍历下一个分类
遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!
'''
class Spider():url='http://www.jokeji.cn/jokehtml/bxnn/2018073023294432.htm'header = {'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Mobile Safari/537.36','Accept-Encoding': '','Referer':'http://www.jokeji.cn/list29_1.htm'}classifys=[] #list集合,存储笑话分类url#获取html文本def __fetch_content(self):cookie_html = request.Request(Spider.url,headers=Spider.header)cookie_html = request.urlopen(cookie_html)htmls=cookie_html.read()#使用chardet获取到htmls的编码格式encoding=chardet.detect(htmls)encoding=encoding['encoding']#不加ignore的时候总是出现字符转换错误,说明有非法字符,必须加上ignore忽略非法字符htmls=htmls.decode(encoding,'ignore')time.sleep(0.1)return htmls#获取笑话分类urldef __analysis_classify(self):Spider.url='http://www.jokeji.cn/'Spider.header['Referer']='http://www.jokeji.cn/'htmls=self.__fetch_content()root_pattern='<div class="joketype l_left">([\s\S]*?)</div>'classify_pattern='<a href="([\s\S]*?)">'root_html=re.findall(root_pattern,htmls)Spider.classifys=re.findall(classify_pattern,str(root_html))#获取当前页面里的所有笑话,返回一个tupledef __analysis(self,htmls):anchors=[]root_pattern='<span id="text110">([\s\S]*?)</span>'juck_pattern='<P>\d、([\s\S]*?)</P>'root_html=re.findall(root_pattern,htmls)for html in root_html:jucks=re.findall(juck_pattern,html)#替换换行符c=re.compile('<[b|B][r|R]\s*/*>')for i in jucks:i=c.sub('\n',i)anchors.append(i)#i=i.replace('<BR>','\n')return anchorsreturn anchors#爬取原创笑话def __analysis_yuanchuangxiaohua(self,url):url='http://www.jokeji.cn'+urlpass#爬取分类下的笑话def __analysis_joke(self):Spider.header['Referer']='http://www.jokeji.cn/'root_pattern='<div class="list_title">([\s\S]*?)</div>'page_pattern='<a href="([\s\S]*?)"\s*target="_blank"\s*>'for classify in Spider.classifys:try:if '/yuanchuangxiaohua' in classify:self.__analysis_yuanchuangxiaohua(classify)classify='http://www.jokeji.cn'+classifySpider.url=classifyhtmls=self.__fetch_content()#记录分类里面最大页面数           max_number=int(re.findall('[\s\S]*?(\d*?)\.htm">尾页</a>',htmls)[0])#开始遍历每一大页,一大页包含很多小页面,小页面里面才是笑话except BaseException:continuefor bigpage_number in range(1,max_number+1):try:bigpage_url=classifytemp=re.compile('(\d*).htm')#更改url,因为分类下每一大页都是有规律的,都是.htm前面的数字从1加到最大页面数bigpage_url=temp.sub(str(bigpage_number)+'.htm',bigpage_url)#替换urlSpider.url=bigpage_urlhtmls=self.__fetch_content()root_html=re.findall(root_pattern,htmls)#获取一大页里面的小页面的url地址pages=re.findall(page_pattern,root_html[0])#遍历所有小页面url,获取其中的笑话except BaseException:continuefor page in pages:try:Spider.url='http://www.jokeji.cn'+pagehtmls=self.__fetch_content()tuples=self.__analysis(htmls)#插入到数据库mysql.insert(tuples)except BaseException:continuedef go(self):self.__analysis_classify()self.__analysis_joke()spider=Spider()
spider.go()

Python爬取笑话存储在mysql里相关推荐

  1. python爬虫实践之爬取笑话段子

    目录 概述 准备 所需模块 涉及知识点 运行效果 完成爬虫 1. 分析网页 2. 爬虫代码 概述 爬取笑话段子. 准备 所需模块 re requests lxml 涉及知识点 python基础 req ...

  2. 【python实现网络爬虫(7)】scrapy爬取笑话大全网站全过程(505问题的解决)

    确定要爬取的网站及内容 笑话大全网站中的冷笑话,如下 要采集的字段,有标题,来源.正文内容 创建scrapy项目 步骤一.启动爬虫项目 在某处(比如桌面)创建一个名称为"scrapy爬取笑话 ...

  3. Python爬取、存储、分析、可视化豆瓣电影Top250

    Python爬取.存储.分析.可视化豆瓣电影Top250 网站链接: https://movie.douban.com/top250 @文章目录 前言 一.python爬取目标数据,并写入csv文件 ...

  4. 爬虫练习一(爬取笑话集)

    爬取笑话集网页 目标网址为:http://www.jokeji.cn/list.html 感觉这个网站挺简单,不用登陆,没有复杂的功能,好爬~ 可以现在浏览器中访问这个链接看一下效果,你会发现这个页面 ...

  5. 使用Scrapy爬取笑话并存储到文件和MySQL

    由于项目的需要,必须学习如何使用Scrapy来爬取数据.这篇博客以爬取笑话网的数据为例,说明Scrapy的基本使用. 配套的源码已经上传,可以从http://download.csdn.net/det ...

  6. Python爬取数据存储到本地文本文件

    前面说过Python爬取的数据可以存储到文件.关系型数据库.非关系型数据库.前面两篇文章没看的,可快速戳这里查看!https://mp.weixin.qq.com/s/A-qry4r3ymuCLXLB ...

  7. Python爬取数据并写入MySQL

    关于爬虫爬取数据并存入MySQL数据库(以东方财富网上的股票数据为例,网页:深南电A(000037)资金流向 _ 数据中心 _ 东方财富网) 第一步,创建数据库中的数据表 import request ...

  8. Python爬取51jobs结尾之MySQL(4)

    将前文数据放至MySQL数据库中 class Data_Transport(object):def __init__(self):"""连接MySQL的qianc_job ...

  9. python:使用selenium爬取51job(前程无忧)并将爬取数据存储到MySql数据库中的代码实例

    自己捣鼓了几天写的代码,基本上把51job的岗位相关的数据都爬下来了,可以视要求自行增减,代码虽然有些简陋,不过我爬取的时候没报什么错.代码适合初学者学习使用,废话不多说,代码如下: from sel ...

最新文章

  1. [转贴]经济学人:Win7拉开新时代序幕 云计算群雄逐鹿
  2. apt-get常用命令
  3. Spring Security 实战干货:自定义配置类入口 WebSecurityConfigurerAdapter
  4. python详细安装教程linux-Linux系统如何安装Python?新手教程
  5. Spring Boot项目搭建易错注意事项
  6. jquery remove() empty()
  7. Ext3.0中复杂表头样例
  8. 完全二叉树的结点数计算
  9. 异步fifo_面试必杀技:异步FIFO(上) CDC的那些事(5)
  10. pojCashier Employment
  11. 二级c语言编程修改out文件夹,国家二级计算机c语言考试 程序设计题最后一题 怎么改out.dat文件 直接在文件里面给出答案...
  12. 激光雷达:Ouster OS产品介绍及使用方法
  13. Otsu算法——最大类间方差法(大津算法)
  14. 调音台docker教程_Docker菜鸟教程 - Docker入门教程 - Docker基础教程 - 动力节点
  15. CSDN去广告JS插件
  16. 优麒麟桌面闪烁_UKUI 桌面环境登陆 Arch Linux!
  17. java isfile 的用法_Java File isFile()方法
  18. erlang json: jsx,rfc4627,mochijson2,jsonx 简单比较
  19. Java代码判断是否是回文数
  20. SCARA四轴机器人丝杆花键_scara机器人专用丝杆花键BNA1616螺母旋转式滚珠丝杆,ZCIV滚珠丝杆花键副...

热门文章

  1. vue使用自定义字体LcdD液晶字体
  2. 智慧校园整体解决方案-最新全套文件
  3. 携手企业创新 共创美好未来——低代码助力企业数字化
  4. SAP配置——MRP
  5. 多站合一音乐搜索、查询、试听、下载解决方案
  6. 创客集结号:电热切割机器
  7. 您说什么它都能理解?对话式搜索了解一下
  8. 基于STM32单片机的语音播报超声波测距系统【ISD1820录放模块继电器蜂鸣器扬声器】
  9. Python 通过adb传输文件到手机
  10. 如何让ubuntu在关机或重启时执行脚本