当前位置: 机械人资讯网 >  笑语欢声

python爬取糗事百科段子并保存至mysql数据库

摘要:作者:XuJiaxin_链接:https://www.jianshu.com/p/22ba0db8b5a01.网络爬虫的准则详细说明请鉴: https://blog.csdn.net/lafengxiaoyu/article/details/77842362 简而言之,服务器上的数据具有产权归属,网络爬虫获取数据牟利将带来法律风险。 一般网站具有反爬虫机制,或者在网站更目录下的robots.txt

python爬取糗事百科段子并保存至mysql数据库

作者:XuJiaxin_

链接:***/p/22ba0db8b5a0

1.网络爬虫的准则

详细说明请鉴: ***patible; MSIE 5.5; Windows NT)headers = {User-Agent: user_agent}url = ***/hot/page/1request = urllib2.Request(url, headers=headers)response = urllib2.urlopen(request)print response.read()

可获取该网页的所有代码

image.png

2)分析页面

image.png

观察网页可发现段子的内容在

利用正则表达式对该内容进行匹配,匹配出段子的作者 点赞数 内容

3)插入数据库

将匹配出的数据使用数组进行接受,插入mysql数据库中,本文使用plmysql进行操作

4.全部代码

# -*- coding:utf-8 -*-import urllibimport urllib2import reimport pymysqlclass fullCode: def __init__(self): self.user_agent = Mozilla/4.0 (compatible; MSIE 5.5; Windows NT) self.headers = {User-Agent: self.user_agent} self.db = pymysql.connect(host=localhost, user=root, password=123456, database=test, port=3306, charset=utf8mb4, cursorclass=pymysql.cursors.DictCursor) def getCode(self,pageIndex): try: cursor = self.db.cursor() for i in range(1, pageIndex): url = ***/hot/page/ + str(i) request = urllib2.Request(url, headers=self.headers) response = urllib2.urlopen(request) # print response.read() content = response.read().decode(utf-8) pattern = re***pile( 
.*?

(.*?)

.*?(.*?)(.*?)
.*?number>(.*?), re.S) items = re.findall(pattern, content) print 第 + str( i) + 页====================================================================================== for item in items: haveImg = re.search(img, item[2]) if not haveImg: print item[0], item[1], item[3] sql = insert into tb_qsbk(author,likenum,content) values(+item[0]+,+item[3]+,+item[1]+) cursor.execute(sql) self.db***mit() self.db.close() except urllib2.URLError, e: if hasattr(e, code): print e.code if hasattr(e, reason): print e.reason def start(self): self.getCode(100)code = fullCode()code.start()

re是python自带的正则表达式库

本次操作掠过了图片的插入,有空再进行修改吧。

结果:

image.png

5.遇到问题

1)安装库时pip报错,可能是版本过低,目前版本18.1,升级pip

python -m pip install --upgrade pip

2)InternalError报错【编码错误】

pymysql.err.InternalError: (1366, uIncorrect string value: \xF0\x9F\x90\xB6\xEF\xBC... for column content at row 1)

原因:

UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。

解决步骤:

1.修改MySQL的字段编码为utf8mb4,就能处理4字节的unicode

命令:alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin; (将TABLE_NAME替换成你的表名)

2、数据库链接

conn=pymysql.connect(

host=127.0.0.1,

port=3306,

user=root,

passwd=123456,

db=test,

charset=utf8mb4,

)

标签:

评论(0)