零python基础--爬虫实践总结

网络爬虫,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。

爬虫主要应对的问题:1.http请求 2.解析html源码 3.应对反爬机制。

觉得爬虫挺有意思的,恰好看到知乎有人分享的一个爬虫小教程:https://zhuanlan.zhihu.com/p/20410446 立马学起!

主要步骤:

1、按照教程下载python、配置环境变量,学习使用pip命令、安装开发ide:pycharm

2、学习使用python发送请求获取页面

3、使用chrome开发者工具观察页面结构特征,使用beautifulsoup解析页面

4、保存页面到本地文件

遇到的主要问题:

1.python基本语法:变量、函数、循环、异常、条件语句、创建目录、写文件。

2.python缩进很重要,缩进决定语句分组和层次,在循环的时候尤其看清楚。

3.编码格式:从代码编辑、到网页内容、中文文件名,无处不有编码格式的问题。

4.beautifulsoup使用。

5.抓取规则失效,重新分析失效页面,重新选择页面特征。

实践,用爬虫获取网页上的试题(自动抓取下一页)代码:

# encoding=utf8
#设置编辑源py文件的编码格式为utf8
import requests, sys, chardet, os, time, random, time
from bs4 import BeautifulSoup

reload(sys)  #必须要重新加载
sys.setdefaultencoding("utf8")

print sys.getdefaultencoding(), sys.getfilesystemencoding()  # utf8 mbcs:MBCS(Multi-ByteChactacterSystem,即多字节字符系统)它是编码的一种类型,而不是某个特定编码的名称
path = os.getcwd() #获取当前文件所在目录
newPath = os.path.join(path, "Computer")
if not os.path.isdir(newPath):
    os.mkdir(newPath) #新建文件夹
destFile = unicode(newPath + "/题目.docx","utf-8) #存为word也可以,不过后续用office编辑后,保存的时候总需要另存为;用unicode()后,文件名取中文名不会变成乱码

#最常见的模拟浏览器,伪装headers
headers = {
    ‘User-Agent‘: ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36‘
}

def downLoadHtml(url):
    html = requests.get(url, headers=headers)
    content = html.content
    contentEn = chardet.detect(content).get("encoding", "utf-8")
    # print contentEn  #GB2312
    try:
        tranCon = content.decode(contentEn).encode(sys.getdefaultencoding())#转换网页内容编码格式;消除中文乱码
    except Exception:
        return content #用了编码转换,为什么还是存在少量页面异常?
    # print tranCon
    else:
        return tranCon

def parseHtml(url):
    # print url, "now"
    content = downLoadHtml(url)
    contentEn = chardet.detect(content).get("encoding", "utf-8")
    soup = BeautifulSoup(content, "html.parser")  # soup.name  [document] BeautifulSoup 对象表示的是一个文档的全部内容
    # 查找下一页url
    theUL = soup.find("ul", {"class": "con_updown"})
    theLi = theUL.find("li")
    href = theLi.find("a").get("href")
    preUrl = None
    if href:
        print href, "next"
        preUrl = href

    # 查找所需内容
    topics = []
    try:
        divCon = soup.find("div", attrs={"class": "con_nr"})
        if divCon:
            subjects = divCon.find_all("p")  # __len__属性不是整数,而是:method-wrapper ‘__len__‘ of ResultSet object
            index = 0 #借助index标识查找第几个,还有别的方式?
            for res in subjects:
                #跳过不想要的导读行内容
                if index == 0 and res.string == "【导读】":
                    index = 1  # 跳出循环也要加1
                    continue  # 跳过 导读
                topic = res.string  # res有子标签及文本,就会返回None
                if topic:
                    #按需要,只留下纯文本,保存到文件
                    try:
                        parsed = topic.decode(contentEn).encode("utf8")
                    except Exception:
                        topics.append("本页面解码有误,请自行查看: " + url + "\n")  # ‘%d‘ %index str(index) 数字转字符串
                        break
                    else:
                        topics.append(parsed + "\n")
                index = index + 1
            topics.append("\n")
        else:
            topics.append("本页面查找试题有误,请自行查看: " + url + "\n")
    except Exception:
        topics.append("本页面解析有误,请自行查看: " + url + "\n")

    fp = open(destFile, ‘a‘)  # a追加写
    fp.writelines(topics)
    fp.close()
    return preUrl

#执行.py文件的入口
if __name__ == ‘__main__‘:
    i = 0 #记录处理了多少页面
    next = "http://xxxxx/1.html" #起始页面
    print "start time:", time.strftime(‘%Y-%m-%d %H:%M:%S‘, time.localtime(time.time())) #打印时间,看跑了多久
    print next, "start"
    while next and i < 1000:
        next = parseHtml(next)
        i = i + 1
        #sTime = random.randint(3, 8) #随机整数 [3,8)
        #time.sleep(sTime)  # 休息:防反爬
    print "end time:", time.strftime(‘%Y-%m-%d %H:%M:%S‘, time.localtime(time.time()))
    print "i =", i, "url:", next
    fp = open(destFile, ‘a‘)  # a追加写
    fp.writelines(["lastPage:" + str(next) + "\n", "total:" + str(i) + "\n"])  # None及数字:无法和字符串用 + 拼接
    fp.close()
时间: 2024-10-13 08:22:49

零python基础--爬虫实践总结的相关文章

Python基础爬虫

搭建环境: win10,Python3.6,pycharm,未设虚拟环境 之前写的爬虫并没有架构的思想,且不具备面向对象的特征,现在写一个基础爬虫架构,爬取百度百科,首先介绍一下基础爬虫框架的五大模块功能,包括爬虫调度器,URL管理器,HTML下载器,HTML解析器,数据存储器,功能分析如下: >>爬虫调度器主要负责统筹其他四个模块的协调工作 >>URL管理器负责管理URL链接,维护已经爬取的URL集合和未爬取的URL集合,提供获取新URL链接的接口 >>HTML下载器

python基础爬虫的框架和运行流程

网络爬虫是什么? 网络爬虫就是:请求网站并提取数据的自动化程序 网络爬虫能做什么? 网络爬虫被广泛用于互联网搜索引擎或其他类似网站,可以自动采集所有其能够访问到的页面内容,以获取或更新这些网站的内容和检索方式. 网络爬虫还被用于爬取各个网站的数据,进行分析.预测近几年来,大量的企业和个人开始使用网络爬虫采集互联网的公开数据,进行数据分析,进一步达到商业目的. 利用网络爬虫能从网上爬取什么数据? 可以好不吹嘘的说,平时从浏览器浏览的所有数据都能被爬取下来. 网络爬虫是否合法? 上面说到了爬虫可以爬

python分布式爬虫实践

近期阅读了范传辉的Python爬虫开发与项目实战一书,对其第七章的分布式爬虫进行实操 遇到自己环境上代码跑不通的问题,经一番功夫,发现主要是由以下几点造成的: 书中环境:python2.7,linux 本地环境:python3.4,window 1.文中导入模块为import Queue,py3中应该为from multiprocessing import Queue 2.window环境下lambda无法被序列化,要使用自定义函数,该自定义函数需要放在代码开头,如下; url_q=Queue(

python 基础-爬虫-数据处理,全部方法

生成时间戳 1. time.time() 输出 1515137389.69163 ===================== 生成格式化的时间字符串 1. time.ctime() 输出 Fri Jan 5 15:34:00 2018 ============================= 2. time.strftime("%Y-%m-%d %H:%M:%S") 输出 2018-01-05 15:34:27 ======================== 生成结构化时间 1.

【python】爬虫实践

参考链接 https://blog.csdn.net/u012662731/article/details/78537432 需要的包 requests 原文地址:https://www.cnblogs.com/Macaulish/p/10344211.html

Python 基础与实践

1. 需要处理xlsb 文件, 查了发现只有pyxlsb可以用,公司防火墙屏蔽了我, 换外网, 得以ping. pyxlsb和pandas1.0以上版本才兼容, 我的版本是0.25... 更新pip install --upgrade pandas 过不了权限, 添加 --user  过了 2. concat 文件添加文件名作为一行column 那是相当简单 when looping to read excel file:  df['column name'] = filename 3. 感受呼

《Python机器学习及实践:从零开始通往Kaggle竞赛之路》

<Python 机器学习及实践–从零开始通往kaggle竞赛之路>很基础 主要介绍了Scikit-learn,顺带介绍了pandas.numpy.matplotlib.scipy. 本书代码基于python2.x.不过大部分可以通过修改print()来适应python3.5.x. 提供的代码默认使用 Jupyter Notebook,建议安装Anaconda3. 最好是到https://www.kaggle.com注册账号后,运行下第四章的代码,感受下. 监督学习: 2.1.1分类学习(Cla

下载大数据实战课程第一季Python基础和网络爬虫数据分析

python语言近年来越来越被程序相关人员喜欢和使用,因为其不仅简单容易学习和掌握,而且还有丰富的第三方程序库和相应完善的管理工具:从命令行脚本程序到gui程序,从B/S到C/S,从图形技术到科学计算,软件开发到自动化测试,从云计算到虚拟化,所有这些领域都有python的身影:python已经深入到程序开发的各个领域,并且会越来越多的人学习和使用. 大数据实战课程第一季Python基础和网络爬虫数据分析,刚刚入手,转一注册文件,视频的确不错,可以先下载看看:链接:http://pan.baidu

Python 基础学习 网络小爬虫

<span style="font-size:18px;"># # 百度贴吧图片网络小爬虫 # import re import urllib def getHtml(url): page = urllib.urlopen(url) html = page.read() return html def getImg(html): reg = r'src="(.+?\.jpg)" pic_ext' imgre = re.compile(reg) imgli