如今大数据时代,爬虫的需求越来越大,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文件的时候报错,可能涉及的内容里面有特殊字母,转码出现问题,通过查看就是上面那段内容开通的特殊字符导致的错误,经过百度,找到了解决问题的方法。
- UnicodeEncodeError 说明是Unicode编码时候的问题;
- '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文件,数据正常。
爬虫主要使用的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文件