Python爬取笑话存储在mysql里
爬取思路:爬取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里相关推荐
- python爬虫实践之爬取笑话段子
目录 概述 准备 所需模块 涉及知识点 运行效果 完成爬虫 1. 分析网页 2. 爬虫代码 概述 爬取笑话段子. 准备 所需模块 re requests lxml 涉及知识点 python基础 req ...
- 【python实现网络爬虫(7)】scrapy爬取笑话大全网站全过程(505问题的解决)
确定要爬取的网站及内容 笑话大全网站中的冷笑话,如下 要采集的字段,有标题,来源.正文内容 创建scrapy项目 步骤一.启动爬虫项目 在某处(比如桌面)创建一个名称为"scrapy爬取笑话 ...
- Python爬取、存储、分析、可视化豆瓣电影Top250
Python爬取.存储.分析.可视化豆瓣电影Top250 网站链接: https://movie.douban.com/top250 @文章目录 前言 一.python爬取目标数据,并写入csv文件 ...
- 爬虫练习一(爬取笑话集)
爬取笑话集网页 目标网址为:http://www.jokeji.cn/list.html 感觉这个网站挺简单,不用登陆,没有复杂的功能,好爬~ 可以现在浏览器中访问这个链接看一下效果,你会发现这个页面 ...
- 使用Scrapy爬取笑话并存储到文件和MySQL
由于项目的需要,必须学习如何使用Scrapy来爬取数据.这篇博客以爬取笑话网的数据为例,说明Scrapy的基本使用. 配套的源码已经上传,可以从http://download.csdn.net/det ...
- Python爬取数据存储到本地文本文件
前面说过Python爬取的数据可以存储到文件.关系型数据库.非关系型数据库.前面两篇文章没看的,可快速戳这里查看!https://mp.weixin.qq.com/s/A-qry4r3ymuCLXLB ...
- Python爬取数据并写入MySQL
关于爬虫爬取数据并存入MySQL数据库(以东方财富网上的股票数据为例,网页:深南电A(000037)资金流向 _ 数据中心 _ 东方财富网) 第一步,创建数据库中的数据表 import request ...
- Python爬取51jobs结尾之MySQL(4)
将前文数据放至MySQL数据库中 class Data_Transport(object):def __init__(self):"""连接MySQL的qianc_job ...
- python:使用selenium爬取51job(前程无忧)并将爬取数据存储到MySql数据库中的代码实例
自己捣鼓了几天写的代码,基本上把51job的岗位相关的数据都爬下来了,可以视要求自行增减,代码虽然有些简陋,不过我爬取的时候没报什么错.代码适合初学者学习使用,废话不多说,代码如下: from sel ...
最新文章
- 腾讯推出的这款高性能 RPC 开发框架,确定不了解下吗?
- 【UIKit】UILabel使用
- LeetCode Minimum Height Trees(拓扑排序)
- 《剑指offer》-- 构建乘积数组、求1+2+3+...+n、不用加减乘除做加法、包含min函数的栈、用两个栈实现队列
- jenkins重启 linux_在Linux中,Jenkins无法启动
- bzoj千题计划287:bzoj1228: [SDOI2009]ED
- Druid Monitor监控JavaSE,杀cmd端口进程
- U盘之家工具包 V1.4
- c语言中罗马字母数字,罗马数字转整数C语言实现
- 高质量论文配图配色,让你的图更加亮眼
- 酒店返现应用评测: 企鹅竟然没有模仿?
- dfuse Search 是所有 EOSIO 开发者的必备工具
- C++ 函数调用过程中栈区的变化——(栈帧、esp、ebp)
- Java面试知识学习(持续更新)
- Supervisor守护Java进程_使用Supervisor来守护我们的服务
- ALEXA站长全攻略(转)
- DBLINK使用的思考
- 英特尔和amd学计算机,笔记本处理器intel和amd哪个好_有什么区别|性能对比-太平洋电脑网...
- jQuery隐藏和显示
- opencv4.5.1 包含了BEBLID算子,一个新的局部特征描述符,超越ORB
热门文章
- 军工保密资质认定的条件
- Outlook客户端添加新邮箱的一些经验
- 用IDEA创建java项目并跑起来
- Android处理屏幕旋转时的解决方案
- vue3项目使用自定义字体font-family
- 论文阅读《Adapted Deep Embeddings: A Synthesis of Methods for k-Shot Inductive Transfer Learning Tyler》
- 答读者问(29):三个在校学生有关在校学习、考研、编程语言、未来工作的疑问及答复
- TheBrain 12:思维导图规则的改变者?
- Mysql Shell 8.0 简介
- 使用ESP-8266模块做一个便携式WIFI杀手