爬取思路:爬取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. 腾讯推出的这款高性能 RPC 开发框架,确定不了解下吗?
  2. 【UIKit】UILabel使用
  3. LeetCode Minimum Height Trees(拓扑排序)
  4. 《剑指offer》-- 构建乘积数组、求1+2+3+...+n、不用加减乘除做加法、包含min函数的栈、用两个栈实现队列
  5. jenkins重启 linux_在Linux中,Jenkins无法启动
  6. bzoj千题计划287:bzoj1228: [SDOI2009]ED
  7. Druid Monitor监控JavaSE,杀cmd端口进程
  8. U盘之家工具包 V1.4
  9. c语言中罗马字母数字,罗马数字转整数C语言实现
  10. 高质量论文配图配色,让你的图更加亮眼
  11. 酒店返现应用评测: 企鹅竟然没有模仿?
  12. dfuse Search 是所有 EOSIO 开发者的必备工具
  13. C++ 函数调用过程中栈区的变化——(栈帧、esp、ebp)
  14. Java面试知识学习(持续更新)
  15. Supervisor守护Java进程_使用Supervisor来守护我们的服务
  16. ALEXA站长全攻略(转)
  17. DBLINK使用的思考
  18. 英特尔和amd学计算机,笔记本处理器intel和amd哪个好_有什么区别|性能对比-太平洋电脑网...
  19. jQuery隐藏和显示
  20. opencv4.5.1 包含了BEBLID算子,一个新的局部特征描述符,超越ORB

热门文章

  1. 军工保密资质认定的条件
  2. Outlook客户端添加新邮箱的一些经验
  3. 用IDEA创建java项目并跑起来
  4. Android处理屏幕旋转时的解决方案
  5. vue3项目使用自定义字体font-family
  6. 论文阅读《Adapted Deep Embeddings: A Synthesis of Methods for k-Shot Inductive Transfer Learning Tyler》
  7. 答读者问(29):三个在校学生有关在校学习、考研、编程语言、未来工作的疑问及答复
  8. TheBrain 12:思维导图规则的改变者?
  9. Mysql Shell 8.0 简介
  10. 使用ESP-8266模块做一个便携式WIFI杀手