Python爬虫,爬取糗事百科

京漂大叔 2019-08-10 PM 4167℃ 0条

如今大数据时代,爬虫的需求越来越大,Python在大数据分析,爬虫上面优势明显,如今Python的用户使用者也是逐渐增多,Python也是一度霸榜最佳语言第一名。

作为一名程序员,当然要与时俱进,不能停止学习的步伐,花了2天时间,写了一个爬取糗事百科的爬虫,刚开始接触,一边百度一边写,终于在今晚11点调试成功。

爬的过程中遇到的问题记录下,避免以后发生类似错误和方便查找解决问题。

❧❧闺蜜每天都会做早操,她可以把腿劈叉,可以劈叉10分钟不动。。。
那天公司16周年庆,她代表部门上去领奖,领到手,她很开心,也喝了几杯,我起哄,劈一个,她为了显示她腿功,直接来个完美的朝天蹬。。。
如果不是嗤的一声,牛仔裤裂开露出绿色小内内的话,那是相当完美了。。。。

爬去到上面这段内容的时候,程序报错如下

File "D:/sicpython/sicpython/dfcf.py", line 51, in saveCsv
    csv_writer.writerow(lds)
UnicodeEncodeError: 'gbk' codec can't encode character '\u2200' in position 195: illegal multibyte sequence

错误位置是,将爬取内容导出到csv文件的时候报错,可能涉及的内容里面有特殊字母,转码出现问题,通过查看就是上面那段内容开通的特殊字符导致的错误,经过百度,找到了解决问题的方法。

  1. UnicodeEncodeError 说明是Unicode编码时候的问题;
  2. 'gbk' codec can’t encode character 说明是将Unicode字符编码为GBK时候出现的问题

此时,往往最大的可能就是,本身Unicode类型的字符中,包含了一些无法转换为GBK编码的一些字符。

解决方法:
指定文件编码为 gb18030,加入encoding = 'gb18030'

with open('csbk.csv','w',newline='',encoding = 'gb18030') as csv_file:

再次运行程序,报错消失,打开导入的csv文件,数据正常。
csbk.png
爬虫主要使用的xpath方法,简单方便,上手容易。类里面有存入csv,读取csv数据,保存图片方法,跟进情况使用爬虫类方法
源码如下:

import requests
import time
import csv
import random
from collections import Counter
from lxml import etree
import sys

# headers = {
#         'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
#         'Accept-Language': 'zh-CN,zh;q=0.9',
#         'Connection':'keep-alive',
#         'Host': 'www.mzitu.com',
#         'Referer': 'http://www.mzitu.com/146445/',
#         'Cookie': 'Hm_lvt_dbc355aef238b6c32b43eacbbf161c3c=1534504633; Hm_lpvt_dbc355aef238b6c32b43eacbbf161c3c=1534508588',
#         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
#     }

class ksfcspider:
    millis = int(round(time.time() * 1000))
    #imgName = 1
    def getUrl(self,sourceurl):
        #print(url)
        #exit()
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'}
        sourceHtml = requests.get(url, headers=headers)
        return sourceHtml.text
    #下载图片
    def write_img(self, imgurl):
        headers2 = {
            #'Referer': '',
            # 'Cookie': 'Hm_lvt_dbc355aef238b6c32b43eacbbf161c3c=1534504633; Hm_lpvt_dbc355aef238b6c32b43eacbbf161c3c=1534508588',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36'
        }
        print("正在存储文件 %d ..." % self.millis)
        # 1. 打开文件,返回一个文件对象
        with open('images/' + str(self.millis) + '.png', 'wb') as f:
            # 2. 获取图片里的内容
            images = requests.get(imgurl,headers=headers2)
            # 3. 调用文件对象write() 方法,将图片的内容写入到文件里
            f.write(images.content)
        print("文件 %d 保存成功!" % self.millis)
        self.millis += 1
    #将数据存到csv文件
    def saveCsv(self,spiderData):

        with open('csbk.csv','w',newline='',encoding = 'gb18030') as csv_file:
            csv_writer = csv.writer(csv_file)
            csv_writer.writerow(["作者","性别","年龄","内容", "好笑", "评论"])  # 标题
            for lds in spiderData:
                csv_writer.writerow(lds)
    #将数据从csv文件读出
    def getCsv(self):
        csvdatas = []
        with open('dfcf1.csv','r',encoding='utf-8') as csv_file:
            reader = csv.reader(csv_file) # reader()方法便利出每行的内容
            for i in reader:
                #print(row)
                csvdatas += i
        return csvdatas

    def onStart(self,sourceHtml):
        selector = etree.HTML(sourceHtml)
        alldata = []
        contentNode = selector.xpath('//div[@id="content-left"][@class="col1"]/div')
        #print(contentNode)
        #exit()
        textc = []
        for acn in contentNode:
            #textcontent = acn.xpath('normalize-space(a/div[@class="content"]/span/text())')
            try:
                author = acn.xpath('div[@class="author clearfix"]/a[2]/h2/text()')[0]#作者
            except:
                author = '匿名用户'
            try:
                xingbie = acn.xpath('div[@class="author clearfix"]/div/@class')[0]#通过获取样式属性,判断class属性值来区分性别

                if xingbie.find('womenIcon')>0:
                    sex = '女'
                elif xingbie.find('manIcon')>0:
                    sex = '男'
                else:
                    sex = '未知'
            except:
                sex = '未知'
            try:
                age = acn.xpath('div[@class="author clearfix"]/div/text()')[0]#年龄
            except:
                age = '未知'

            textcontent = acn.xpath('a/div[@class="content"]/span/text()')#内容
            textcontentnum = len(textcontent)
            if textcontentnum > 1:
                for num  in range(0,textcontentnum):
                    textc +=textcontent[num]
            else:
                textc = textcontent[0].strip()
            newcontent = (''.join(textc)).strip() #笑话内容
            textc = []#清空临时列表内容
            haoxiaonumber = acn.xpath('div[@class="stats"]/span[@class="stats-vote"]/i/text()')[0]#大笑数量
            pinglunnumber = acn.xpath('div[@class="stats"]/span[@class="stats-comments"]/a/i/text()')[0]#评论数量
            nodecontent = (author, sex, age, newcontent, haoxiaonumber, pinglunnumber)

            alldata.append(nodecontent)
        return alldata
        #self.saveCsv(alldata) #存储数据到csv文件
        # print(alldata)
        #print(write_time)
        #exit()




if __name__ == '__main__':
    spider = ksfcspider()
    #url = "https://www.ebay.com/sch/i.html?_from=R40&_sacat=0&_oac=1&_nkw=Printer+Spare+Parts&_pgn=1&_skc=50&rt=nc"1007734
    spiderData = []
    alldatas = []
    data = spider.getCsv()
    for page in range(1,6):
        print('正在处理:%s' % page)
        #number = page*50
        url = "https://www.qiushibaike.com/text/page/"+str(page)
        sourceHtml = spider.getUrl(url)
        spiderData = spider.onStart(sourceHtml)
        time.sleep(random.random() * 3)
        alldatas += spiderData
        time.sleep(random.random() * 3) #设置时间间隔防止ip被封
    #print(alldatas)
    spider.saveCsv(alldatas)  # 存储数据到csv文件
标签: Python, 爬虫

非特殊说明,文章均为原创。

评论啦~