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

1.网络爬虫的准则

详细说明请鉴: https://blog.csdn.net/lafengxiaoyu/article/details/77842362
简而言之,服务器上的数据具有产权归属,网络爬虫获取数据牟利将带来法律风险。
一般网站具有反爬虫机制,或者在网站更目录下的robots.txt文件下会说明那些网页可爬取,哪些不可爬取,请遵守这些规则,无限制使用爬虫会对服务器造成负担。

2.爬取前准备

1)python环境准备
    略,百度即可,本文使用python2.7,建议使用 python2.7+ 的版本,版本过低有些库不能使用 
    推荐使用python2.7或python3.5版本,稳定
2)安装requests(可不使用),urllib2,pymysql
pip install requests
pip install urllib2
pip install pymysql

3.原理

1)模拟http请求获取获取网页
image.png

模拟请求代码:

# -*- coding:utf-8 -*-
import urllib2

user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-Agent': user_agent}
url = 'http://www.qiushibaike.com/hot/page/1'
request = urllib2.Request(url, headers=headers)
response = urllib2.urlopen(request)
print response.read()

可获取该网页的所有代码


image.png
2)分析页面
image.png

观察网页可发现段子的内容在<div class="article block untagged mb15 typs_long">下
利用正则表达式对该内容进行匹配,匹配出段子的作者 点赞数 内容

3)插入数据库

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

4.全部代码

# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
import pymysql

class 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 = 'http://www.qiushibaike.com/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.compile(
                    '<div class="author clearfix">.*?<h2>(.*?)</h2>.*?<div.*?span>(.*?)</span>(.*?)<div class="stats">.*?"number">(.*?)</i>',
                    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.commit()
            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, u"Incorrect 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',
)

--完

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容