Python小白写的三个入门级的爬虫(附注释)
写在前面的话:作者目前正在学习Python,还是一名小白,所以注释可以会有些不准确的地方,望谅解。
这三个小爬虫不是很难,而且用处可能也不大,主要还是锻炼新手对函数的运用与理解
大牛和意义党可以先绕过了
附:我用的是Pyton2.713,用3.0的朋友运行可能会有些代码出错
第一个,网页源代码爬虫;
#-- coding: utf-8 --
#一个巨详细又简单的小爬虫
#---------------------------------
import string
from urllib2 import urlopen #通过from import导入urllib2库中的urlopen模块,用于抓取url的内容
url = raw_input('>') #使用raw_input函数让用户输入想要爬取的网页,并且赋值给变量
x = urlopen('http://'+url) #调用urlopen获取源码并赋值给变量 前边加上http://是怕用户忘记输入http协议
print x.read() #最后使用read函数查看并使用print打印出来
用Python自带的IDLE打开,输入www.baidu.com ,效果如图;
第二个,爬取并下载百度贴吧的内容;
#-- coding: utf-8 --
#爬取并下载百度贴吧的html文件
#作者:秦王IPC
#------------------------------------------------
import string #调用模块
from urllib2 import urlopen #调用urllib2库中的模块
#---------------------------------
#定义函数
def paqutieba(url,x,y):
for j in range(x, y+1): #循环从开始页面到终点页面
Name = string.zfill(j,5) + '.html' #string.zfill(1,5) 文件名效果00001.
print '正在下载第' + str(j) + '个网页内容,并将其存储为' + Name + '......' #下载的时候打印
l = open(Name,'w+') #将写入操作赋值给变量l
k = urlopen(url + str(j)).read() #调用urlopen模块抓取网页内容并查看并赋值给变量k
l.write(k) #将k内容写入
l.close() #关闭
#---------------------------------与用户交互---------------
url = str(raw_input(u'请输入贴吧的地址,去掉?pn=后面的数字:\n格式:https://tieba.baidu.com/p/xxxxxxxxx?pn= \n>>>'))
x = int(raw_input(u'请输入开始的页数:\n'))
y = int(raw_input(u'请输入终点的页数:\n'))
paqutieba(url,x,y) #调用函数
用Python自带的IDLE打开,随意输入一个贴吧地址 (有些URL没有 ?pn= 得自己加上去),效果如图;
第三个,爬取内涵段子并写入文本(这个对新手来讲可能有点难理解和麻烦)
需要用到的工具:谷歌浏览器,火狐浏览器,和一颗坚持下去的心。
准备工作
1.用谷歌打开内涵段子官网,然后按F12进行抓包,如图;
初始框在右边,可以在Dock side那里调到下面,选择Network,然后点All,如果左上角不是红点,就点一下(是红色就不用点)表示浏览器正对此页面进行抓包。
再然后滑到最下面点击加载更多;
此时查看抓到的内容,找到图中的文件,并且复制Request URL 的链接地址,在火狐浏览器中打开,(之所以用火狐是因为火狐自带转码,不然用谷歌打开可能会是乱码);
在火狐浏览器中打开如图;
然后点开可以发现,段子内容在 data>data>0>group>text路径下;
还可以发现,不止有0,还有1,2,3,4,5....19,可以猜到这应该是页数之类的。所以后面可以利用代码来循环爬取更多的内容;
还需要突破反爬措施,其实很简单,只需要将Request Headers下的内容复制放进代码里就行了(不过要记得加''和:分开来,代码部分有);
代码部分
'''
Title = 爬取内涵段子写入进文本
coder = 秦王IPC
date = 2018-01-30
因为使用while循环,所以需要手动停止,不然会一直写入下去。
'''
import requests #网络请求模块
import time #时间模块,下面要设置访问间隔时间。如果不设置,服务器可能会认为你是恶意攻击,就会进行防护措施,如封IP什么的。
import sys
reload(sys)
sys.setdefaultencoding('utf-8')#这三行是转码
header = {'Host':'neihanshequ.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN,en-US;q=0.7,en;q=0.3',
'Accept-Encoding': 'gzip, deflate',
'Referer': 'http://neihanshequ.com/',
'X-CSRFToken': 'e9b62faa6a962cdf92f1531b498fc771',
'X-Requested-With': 'XMLHttpRequest',
'Cookie': 'csrftoken=e9b62faa6a962cdf92f1531b498fc771; tt_webid=6486401443292186126; uuid="w:c07f437659474cc1a7cfd052d9985b37"; Hm_lvt_3280fbe8d51d664ffc36594659b91638=1511848146,1512200937,1512371475,1514373568',
'Connection': 'keep-alive',
'Pragma': 'no-cache',
'Cache-Control': 'no-cache'}
#添加网页的Request Headers信息,伪装成通过浏览器访问,目的是为了突破反爬措施。
timestamp = 1517361103 #设置并赋值起始时间戳 --下面的while循环是利用时间戳来判断
while type(timestamp) == int or type(timestamp) == float: #保证时间戳不管是哪种类型的数值都能运行
url = 'http://neihanshequ.com/joke/?is_json=1&app_name=neihanshequ_web&max_time='+str(timestamp) #用F12抓包然后点加载更多获取原始链接
html = requests.get(url,headers=header)#使用get请求url内容,并赋值为html
time.sleep(3) #设置间隔时间
for u in range(len(html.json()['data']['data'])):
#print(len(html.json()['data']['data']))判断一页有多少段子,放进for语句中就是有多少循环多少的意思
with open(r'c:\duanzi.txt','a' ) as ipc: #使用with。设置写入路径
nr=html.json()['data']['data'][u]['group']['text'] #html.json是文件类型,方括号里面的是内容所在路径
ipc.write(nr+'\n') #进行写入操作
timestamp = html.json()['data']['max_time'] #每当循环一次结束后,返回新的时间戳进行下一次循环
#--------------------------可以加可不加---------------------
#print(html.status_code)#返回状态码
#print(html.json()['data']['max_time'])#返回时间戳
运行效果;
小白的第一篇博客,有错误或是不准确的地方可以在评论区里指出(注意用词文明),谢谢!