Python小白写的三个入门级的爬虫(附代码和注释)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python小白写的三个入门级的爬虫(附代码和注释)相关的知识,希望对你有一定的参考价值。

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‘])#返回时间戳

运行效果;
技术分享图片

小白的第一篇博客,有错误或是不准确的地方可以在评论区里指出(注意用词文明),谢谢!

以上是关于Python小白写的三个入门级的爬虫(附代码和注释)的主要内容,如果未能解决你的问题,请参考以下文章

保姆级Java入门练习教程,附代码讲解,小白零基础入门必备(建议收藏)

Python爬虫小白入门必读,成为大牛必须经历的三个阶段

python爬虫小小白入门

python爬虫如何入门

小白学 Python 爬虫:前置准备Linux基础入门

Python小白入门系列教程:注释变量输出运算符,看过的都收藏了