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

相关文章

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

UE3脚本UnrealScript UC语法点滴

持续更新 目录 类定义修饰符  1.dependson(CLASSNAME) 2.config(ININAME) 3.native 4.notplaceable 5.inherits(CLASSNAME1[,CLASSNAME2,...]) 类对象实例创建 类默认属性设置 变量 1.声明 var local 2.修饰符 config  3.array 类型变量 以及

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

C++必修:模版的入门到实践

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C++学习 贝蒂的主页:Betty’s blog 1. 泛型编程 首先让我们来思考一个问题,如何实现一个交换函数? void swap(int& x, int& y){int tmp = x;x = y;y = tmp;} 相信大家很快就能写出上面这段代码,但是如果要求这个交换函数支持字符型

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

Python 字符串占位

在Python中,可以使用字符串的格式化方法来实现字符串的占位。常见的方法有百分号操作符 % 以及 str.format() 方法 百分号操作符 % name = "张三"age = 20message = "我叫%s,今年%d岁。" % (name, age)print(message) # 我叫张三,今年20岁。 str.format() 方法 name = "张三"age

ps基础入门

1.基础      1.1新建文件      1.2创建指定形状      1.4移动工具          1.41移动画布中的任意元素          1.42移动画布          1.43修改画布大小          1.44修改图像大小      1.5框选工具      1.6矩形工具      1.7图层          1.71图层颜色修改          1

C++入门01

1、.h和.cpp 源文件 (.cpp)源文件是C++程序的实际实现代码文件,其中包含了具体的函数和类的定义、实现以及其他相关的代码。主要特点如下:实现代码: 源文件中包含了函数、类的具体实现代码,用于实现程序的功能。编译单元: 源文件通常是一个编译单元,即单独编译的基本单位。每个源文件都会经过编译器的处理,生成对应的目标文件。包含头文件: 源文件可以通过#include指令引入头文件,以使

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码+详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 (2)通过传入width属性, 可以自定义下拉选项的宽度 (3)通过传入classN

一道经典Python程序样例带你飞速掌握Python的字典和列表

Python中的列表(list)和字典(dict)是两种常用的数据结构,它们在数据组织和存储方面有很大的不同。 列表(List) 列表是Python中的一种有序集合,可以随时添加和删除其中的元素。列表中的元素可以是任何数据类型,包括数字、字符串、其他列表等。列表使用方括号[]表示,元素之间用逗号,分隔。 定义和使用 # 定义一个列表 fruits = ['apple', 'banana