python3 [入门基础实战] 爬虫入门之xpath爬取脚本之家python栏目

本文主要是介绍python3 [入门基础实战] 爬虫入门之xpath爬取脚本之家python栏目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这次爬取的确实有些坎坷,经过了两个晚上吧,最后一个晚上还是爬取数据到最后一公里了,突然报错了。又得继续重新进行爬取


先来个爬取结果图,这次爬取的是标题,url,还有日期,估计也就只有这么多内容,用的单线程,

爬取结果:
这里写图片描述

爬取的过程很蛋疼,最后是昨天晚上爬取出来的,下次争取不用单线程进行任务了。

先来份代码:

# -*- coding: UTF-8 -*-
import threading  # 导入threading包
from lxml import etree
import requests
import re
import chardet
from  openpyxl import Workbook
import time
# 脚本之家baseUrl = 'http://www.jb51.net/list/list_97_1.htm'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2372.400 QQBrowser/9.5.10548.400'}pageNum = 1  # 用来计算爬取的页数
wb = Workbook()
ws = wb.active
ws.title = '脚本之家脚本python专栏'
ws.cell(row=1, column=1).value = '标题'
ws.cell(row=1, column=2).value = '链接'
ws.cell(row=1, column=3).value = '日期'def getHtml(url):req = requests.get(url, headers)# print('html:'+req.text.encode(req.encoding).decode('gb2312'))return req.text.encode(req.encoding).decode('gb2312')def etreeMyHtml(html):global pageNumprint('******' * 40)html = etree.HTML(html)result = etree.tostring(html, pretty_print=True, encoding='gb2312')# 因为每页有四十页for page in range(1, 41):# 标题title = html.xpath('//*[@id="contents"]/div/div[1]/div/div[3]/dl/dt[%s]/a/text()' % page)# 日期timeData = html.xpath('//*[@id="contents"]/div/div[1]/div/div[3]/dl/dt[%s]/span/text()' % page)# 链接(因为用的是相对链接,所以要加上:http://www.jb51.net)nextUrl = html.xpath('//*[@id="contents"]/div/div[1]/div/div[3]/dl/dt[%s]/a/@href' % page)print('str1=== ' + str(title[0]))print('timeData=== ' + str(timeData[0]))nextUrl = 'http://www.jb51.net' + nextUrl[0]print('nextUrl=== ' + str(nextUrl))# ver_info = list(zip(title[0],nextUrl,timeData[0]))pageNum = pageNum + 1ws.cell(row=pageNum, column=1).value = title[0]ws.cell(row=pageNum, column=2).value = nextUrlws.cell(row=pageNum, column=3).value = timeData[0]# print('中文')
# data = getHtml(baseUrl)
# etreeMyHtml(data)
# print('中文')def start(page1,page2):try:for i in range(page1, page2):mUrl = 'http://www.jb51.net/list/list_97_%s.htm' % iprint('url ' + mUrl)data = getHtml(mUrl)etreeMyHtml(data)except:print('error '+i)finally:wb.save('脚本之家脚本python专栏' + '.xlsx')def task1():print('task1 start...')start(1,71)
def task2():print('task2  init...')start(71,153)# print("多线程:")
# starttime = time.time();  # 记录开始时间
# threads = []  # 创建一个线程列表,用于存放需要执行的子线程
# t1 = threading.Thread(target=task1)  # 创建第一个子线程,子线程的任务是调用task1函数,注意函数名后不能有()
# threads.append(t1)  # 将这个子线程添加到线程列表中
# t2 = threading.Thread(target=task2)  # 创建第二个子线程
# threads.append(t2)  # 将这个子线程添加到线程列表中
#
# for t in threads:  # 遍历线程列表
#     t.setDaemon(True)  # 将线程声明为守护线程,必须在start() 方法调用之前设置,如果不设置为守护线程程序会被无限挂起
#     t.start()  # 启动子线程
# endtime = time.time();  # 记录程序结束时间
# totaltime = endtime - starttime;  # 计算程序执行耗时
# print("耗时:{0:.5f}秒".format(totaltime));  # 格式输出耗时
# print('---------------------------')# 以下为普通的单线程执行过程,不需解释
print("单线程:")
starttime = time.time();
start(1,153)
endtime = time.time();
totaltime = endtime - starttime;
print("耗时:{0:.5f}秒".format(totaltime));

总结一下:

遇到的坑:脚本之家的编码是gb2312,首次使用xpath,用完感觉还不错,比正则耗时少了,主要是直接浏览器F2,然后选中元素右键copy->xpath 就可以了, 而且上一篇文章写的很清楚,也比较容易入门

  1. 得到源网页:

def getHtml(url):req = requests.get(url, headers)# print('html:'+req.text.encode(req.encoding).decode('gb2312'))return req.text.encode(req.encoding).decode('gb2312')

  • 通过xpath进行相应的数据进行解析

def etreeMyHtml(html):global pageNumprint('******' * 40)html = etree.HTML(html)# result = etree.tostring(html, pretty_print=True, encoding='gb2312')# 因为每页有四十页for page in range(1, 41):# 标题title = html.xpath('//*[@id="contents"]/div/div[1]/div/div[3]/dl/dt[%s]/a/text()' % page)# 日期timeData = html.xpath('//*[@id="contents"]/div/div[1]/div/div[3]/dl/dt[%s]/span/text()' % page)# 链接(因为用的是相对链接,所以要加上:http://www.jb51.net)nextUrl = html.xpath('//*[@id="contents"]/div/div[1]/div/div[3]/dl/dt[%s]/a/@href' % page)print('str1=== ' + str(title[0]))print('timeData=== ' + str(timeData[0]))nextUrl = 'http://www.jb51.net' + nextUrl[0]print('nextUrl=== ' + str(nextUrl))# ver_info = list(zip(title[0],nextUrl,timeData[0]))pageNum = pageNum + 1ws.cell(row=pageNum, column=1).value = title[0]ws.cell(row=pageNum, column=2).value = nextUrlws.cell(row=pageNum, column=3).value = timeData[0]

  • 使用try except finaly 进行数据的爬取,这样保证在最后也能进行数据的保存

def start(page1,page2):try:for i in range(page1, page2):mUrl = 'http://www.jb51.net/list/list_97_%s.htm' % iprint('url ' + mUrl)data = getHtml(mUrl)etreeMyHtml(data)except:print('error '+i)finally:wb.save('脚本之家脚本python专栏' + '.xlsx')

这次是失业了, 确实公司比较小,发工资都是老板亲手来发工资,遇到个京东众筹,资金又暂时的周转不过来,只能先把我这来了半年不到的小喽啰给裁掉咯。以后android 可能会慢慢放弃,转向大数据方向吧。python,你用你知道爽。下次学习招聘网站的爬取,因为自己要找工作了嘛。

这篇关于python3 [入门基础实战] 爬虫入门之xpath爬取脚本之家python栏目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/606344

相关文章

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处