[Python从零到壹] 七.网络爬虫之Requests爬取作者个人博客网站及CSV存储

2023-11-10

欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。

前一篇文章讲述了 BeautifulSoup 爬取作者个人博客网站,通过案例的方式让大家熟悉Python网络爬虫。这篇文章将详细讲解Requests库爬取作者个人博客网站,并存储至CSV文件。原本想讲解DB-TOP250案例,但因为某些原因修改成了个人博客爬取,方法类似,都能普及简单的预处理知识。 希望对您有所帮助,本文参考了作者CSDN的文章和学生杨友的博客,从学生的角度实现网络爬虫,可能对读者更友好。参考链接如下:

最后推荐大家关注我学生CSDN的博客,十分怀恋给他们上课的情形,博客也写得不错,写作风格和我也很像,哈哈~ 学生杨友问我 “他现在不编程该行了,觉得遗憾吗?” 我的回答是 “有点遗憾,但只要是我学生的选择,自己喜欢,我都支持;也希望他们积极的去做,把每一件事做好做深,如有需要定会帮助,一起加油!”

在这里插入图片描述

作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。

前文赏析:


一.requests基本用法

requests模块是用Python语言编写的、基于urllib的第三方库,采用Apache2 Licensed开源协议的http库。它比urllib更方便简洁,既可以节约大量的工作,又完全满足http测试需求。requests是一个很实用的Python库,编写爬虫和测试服务器响应数据时经常会用到,使用requests可以轻而易举的完成浏览器相关操作。功能包括:

  • 支持HTTP连接保持和连接池
  • 支持使用cookie保持会话
  • 支持文件上传
  • 支持自动响应内容的编码
  • 支持国际化的URL和POST数据自动编码

推荐大家从requests官方网站进行学习,这里只做简单介绍。官方文档地址:

在这里插入图片描述


假设读者已经使用“pip install requests”安装了requests模块,下面讲解该模块的基本用法。

1.导入requests模块
使用语句如下:

import requests

2.发送请求
requests模块可以发送http常用的两种请求:GET请求和POST请求。其中GET请求可以采用url参数传递数据,它是从服务器上获取数据;而POST请求是向服务器传递数据,该方法更为安全,更多用法请读者下来学习。

下面给出使用GET请求和POST请求获取某个网页的方法,得到一个命名为r的Response对象,通过这个对象获取我们所需的信息。

import requests

r = requests.get('https://github.com/timeline.json')
r = requests.post("http://httpbin.org/post")

其他方法如下:

requests.put("http://httpbin.org/put")
requests.delete("http://httpbin.org/delete")
requests.head("http://httpbin.org/get")
requests.options("http://httpbin.org/get") 

3.传递参数
url通常会传递某种数据,这种数据采用键值对的参数形式置于url中,比如:

  • http://www.eastmountyxz.com/index.php?key=value

requests通过params关键字设置url参数,以一个字符串字典来提供这些参数。假设作者想传递 key1=value1 和 key2=value2 到httpbin.org/get ,那么你可以使用如下代码:

import requests

payload = {'key1':'value1', 'key2':'value2'}
r = requests.get('http://httpbin.org/get', params=payload)
print(r.url)
print(r)

输出结果如下图所示:

在这里插入图片描述


4.响应内容
requests会自动解码来自服务器的内容,并且大多数Unicode字符集都能被无缝地解码。当请求发出后,Requests会基于HTTP头部对响应的编码作出有根据的推测。

使用语句如下:

import requests

r = requests.get('https://github.com/timeline.json')
print(r.text)

输出结果如下图所示:

在这里插入图片描述

常用响应内容包括:

  • r.encoding
    获取当前的编码
  • r.encoding = ‘utf-8’
    设置编码
  • r.text
    以encoding解析返回内容。字符串方式的响应体,会自动根据响应头部的字符编码进行解码
  • r.content
    以字节形式(二进制)返回。字节方式的响应体,会自动为你解码gzip和deflate压缩
  • r.headers
    以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
  • r.status_code
    响应状态码
  • r.raw
    返回原始响应体,也就是urllib的response对象,使用r.raw.read()
  • r.ok
    查看r.ok的布尔值便可以知道是否登陆成功
  • r.json()
    Requests中内置的JSON解码器,以json形式返回,前提返回的内容确保是json格式的,不然解析出错会抛异常
  • r.raise_for_status()
    失败请求(非200响应)抛出异常

post发送json请求:

import requests
import json
  
r = requests.post('https://api.github.com/some/endpoint',
                  data=json.dumps({'some': 'data'}))
print(r.json())

5.定制请求头
如果你想为请求添加http头部,只要简单地传递一个字典(dict)给消息头headers参数即可。例如,我们给github网站指定一个消息头,则语句如下:

import requests

data = {'some': 'data'}
headers = {'content-type': 'application/json',
           'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}
 
r = requests.post('https://api.github.com/some/endpoint',
                  data=data,
                  headers=headers)
print(r.text)

输出结果如下图所示:

在这里插入图片描述


6.获取状态码和Cookies

  • r.headers
    返回字典类型,头信息
  • r.requests.headers
    返回发送到服务器的头信息
  • r.status_code
    响应状态码
  • r.cookies
    返回cookie
  • r.history
    返回重定向信息,可以在请求是加上 allow_redirects = false 阻止重定向

具体示例如下:

import requests

#获取返回状态
r = requests.get('https://github.com/Ranxf')
print(r.status_code)
print(r.headers)
print(r.cookies)

#打印解码后的返回数据
r1 = requests.get(url='http://dict.baidu.com/s',
                  params={'wd': 'python'})
print(r1.url)
print(r1.text)

输出结果如下图所示:

在这里插入图片描述

同时响应状态码可以结合异常处理,如下:

import requests

URL = 'http://ip.taobao.com/service/getIpInfo.php'  # 淘宝IP地址库API
try:
    r = requests.get(URL, params={'ip': '8.8.8.8'}, timeout=1)
    r.raise_for_status()  # 如果响应状态码不是 200,就主动抛出异常
except requests.RequestException as e:
    print(e)
else:
    result = r.json()
    print(type(result), result, sep='\n')

7.超时设置
设置秒数超时,仅对于链接有效。

r = requests.get('url',timeout=1)

8.代理设置

proxies = {'http':'ip1','https':'ip2' }
requests.get('url',proxies=proxies)

本小节只是简单介绍了requests模块,推荐读者下来结合案例和官方网站进行更深入的学习和操作。


二.网页DOM树分析

1.网页源码分析

作者的个人网站主要是对博客的介绍,其它网站类似,大家要学会如何进行网站的DOM树结构分析,包括DB。本文主要介绍BeautifulSoup技术爬取作者博客信息。第一部分将介绍分析网页DOM树结构。爬取作者博客的地址为:

在这里插入图片描述

上图中显示了作者的博客信息,包括博客名称、博客原文链接、博客摘要等信息,接下来需要对其进行DOM树结构分析。HTML网页是以标签对的形式出现,如< html >< /html >、< div >< /div >等,这种标签对呈树形结构显示,通常称为 DOM树结构

当我们拿到一个网页的时候,第一步并不是去测试它能否能使用requests简单请求到html,而是要去选择合适的方法进行爬取该网页,弄明白它数据的加载方式,才可以让我们的事半功倍,选择一个好的请求方法也可以提升我们爬虫程序的效率。

右键审查元素显示HTML源代码,如下图所示。

在这里插入图片描述

可以发现它是在< div class=”essay”>< /div >路径下,它包括一个< h1>< /h1>记录标题,一个< p>< /p>记录摘要信息,每一个< div class=”essay”>< /div >分别对应一篇论文的信息。其中,博客《再见北理工:忆北京研究生的编程时光》HTML中对应内容为:

<div class=”essay”>
	<h1>....</h1>
	<p>.....</p>
</div >

通过class值为“essay”可以定位博客的信息。调用BeautifulSoup扩展包的find_all(attrs={“class”:“essay”}) 函数可以获取其信息。对应的HTML部分代码如下:

<div class="essay">
	<h1 style="text-align:center">
	<a href="http://blog.csdn.net/eastmount/article/details/52201984">再见北理工:忆北京研究生的编程时光</a>
	</h1>
	<p style="text-indent: 2em;">  两年前,我本科毕业写了这样一篇文章:《 回忆自己的大学四年得与失 》,
	感慨了自己在北理软院四年的所得所失;两年后,我离开了帝都,回到了贵州家乡,准备开启一段新的教师生涯,
	在此也写一篇文章纪念下吧!还是那句话:这篇文章是写给自己的,希望很多年之后,回想起自己北京的六年时光,
	也是美好的回忆。文章可能有点长,但希望大家像读小说一样耐心品读,....
	</p>
</div>

2.网页结构分析(翻页)

网站翻页是网络爬虫中至关重要的一环,我们进入网站,查看它的网页结构。点击 “下一页” ,查看它的URL链接,会发现下面的规律:

在这里插入图片描述

1页URL:http://www.eastmountyxz.com/page=12页URL:http://www.eastmountyxz.com/page=2
...14页URL:http://www.eastmountyxz.com/page=1415页URL:http://www.eastmountyxz.com/page=15

其它方式:

1页URL:http://www.eastmountyxz.com/blog250?start=25&filter=2页URL:http://www.eastmountyxz.com/blog250?start=25&filter=3页URL:http://www.eastmountyxz.com/blog250?start=50&filter= 
...10页URL:http://www.eastmountyxz.com/blog250?start=225&filter=

它是存在一定规律的,blog250?start=25表示获取第2页(序号为26到50号)的博客信息;blog250?start=50表示获取第3页(序号为51到75号)的博客信息,依次类推。

方法一:
我们结合数学公式写一个循环获取完整的250篇博客的信息。核心代码如下:

i = 0  
while i<10:  
    num = i*25  #每次显示25部 URL序号按25增加  
    url = 'http://www.eastmountyxz.com/blog?start=' + str(num) + '&filter='  
    crawl(url)  #爬虫博客信息
    i = i + 1

方法二:
需要写一个for循环,生成从0到225的数字即可,从上面的链接可以看出来,它的间隔为25,for page in range(0, 226, 25) 必须要取超过停止数据225,因为255不包含在其中,25是它的公差,程序表示为:

for page in range(0, 226, 25):
	url = 'http://www.eastmountyxz.com/blog?start=%s&filter=' % page
	print(url)

接下来使用python的requests库去代替浏览器请求网页的服务器,返回HTML文件,提取并保存信息,再生成下一页的链接,继续上面请求服务器的操作爬取信息。


三.Requests请求服务器

在向服务器发出请求时,我们先选择第一个链接来进行测试,完成本页所有内容的获取,然后再获取所有页面的信息。

1.导入包

  • 如果没有安转 requests , 可以使用pip直接安转
  • 步骤:win+r运行——>cmd——>pip install requests

2.设置浏览器代理

  • 网页点击右键,打开检查,选择Network,All
  • 刷新网页,选择第一个文件,双击,选择headers

在这里插入图片描述

设置的浏览器代理必须为字典型,如:

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
     AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}

3.请求服务器格式

请求源代码向服务器发出请求,200代表成功。如果在后面加上 .text 表示输出文本内容。

  • url是用一个链接
  • headers是用来做浏览器代理的内容
requests.get(url = url, headers = headers)

4.请求服务器代码汇总

这里以第一页内容为例,核心代码如下所示:

# -*- coding: utf-8 -*-
import requests

#设置浏览器代理,它是一个字典
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
        AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
url = 'http://www.eastmountyxz.com/'

#向服务器发出请求
r = requests.get(url = url, headers = headers)
r.encoding = 'utf-8'
print(r.text)

输出结果如下图所示:

在这里插入图片描述


四.xpath提取信息

1.获取xpath节点方法

xpath是按照HTML标签的方式进行定位的,谷歌浏览器自带有xpath,可以直接复制过来使用,简单方便,运行速度快。

  • 第一步:鼠标放在需要的内容上,右击检查;
  • 第二步:鼠标放在内容上右击;
  • 第三步:Copy XPath

输出结果为:

  • //*[@id=“zw”]/div[2]/h1/a

在这里插入图片描述

我们使用xpath时,也必须先对网页进行 lxml 库中的 etree 解析,把它变为特有的树状形式,才能通过它进行节点定位。

from lxml import etree            #导入解析库
html_etree = etree.HTML(reponse)  #树状结构解析

2.xpath提取文本

当我们提取标签内的文本时,需要在复制到的xpath后面加上 /text() ,告诉它我们需要提取的内容是一个标签呈现的数据,如《再见北理工:忆北京研究生的编程时光》。

<a href="xxxx">再见北理工:忆北京研究生的编程时光</a>

结合xpath所提取的文字代码为:

# coding:utf-8
# By:Eastmount 2021-02-25
import requests
from lxml import etree

#设置浏览器代理,它是一个字典
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
        AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
url = 'http://www.eastmountyxz.com/'

#向服务器发出请求
r = requests.get(url = url, headers = headers)
r.encoding = 'utf-8'
content = r.text

#解析DOM树结构
html_etree = etree.HTML(content)
name = html_etree.xpath('//*[@id="zw"]/div[2]/h1/a/text()')
print ("这是数组形式:",name)
print ("这是字符串形式:",name[0])

输出结果如下所示:

这是数组形式: ['再见北理工:忆北京研究生的编程时光']
这是字符串形式: 再见北理工:忆北京研究生的编程时光

3.xpath提取链接

每一个链接都是在标签内的,通常放在 src=" " 或者 href=" " 之中,如

在这里插入图片描述

xpath为:

//*[@id="zw"]/div[2]/h1/a

提取链接时,需要在复制到的xpath后面加上 /@href , 指定提取链接。

movie_url = html_etree.xpath('//*[@id="zw"]/div[2]/h1/a/@href')
print ("这是数组形式:",movie_url)
print ("这是字符串形式:",movie_url[0])

输出结果如下所示:

这是数组形式: ['http://blog.csdn.net/eastmount/article/details/52201984']
这是字符串形式: http://blog.csdn.net/eastmount/article/details/52201984

4.xpath提取标签元素

这个网页中博客的< div>的标签表示,如:

在这里插入图片描述

所以只需要取出 class=" " 中的内容就可以得到,复制它的xpath,和提取链接的方法一样,在后面加上 /@class 即可。

rating = html_etree.xpath('//*[@id="zw"]/div[2]/@class')
print ("这是数组形式:",rating)
print ("这是字符串形式:",rating[0])

输出结果如下所示:

在这里插入图片描述


五.正则表达式匹配信息

前面第四篇文章我们详细介绍了正则表达式的内容,它常常会与网络爬虫和数据预处理结合起来,简化我们的工作。这里需要把结果中的信息匹配出来,可以使用正在表达式,单独提取自己需要的信息,如DB评分的星级,它都是以 rating5-t 方式呈现的,但是我们只需要它数字5位置的部分,所以需要进行二次提取。

1.提取固定位置信息

正则表达式中可以使用 .*? 来进行匹配信息,没有加括号时可以去掉不一样的信息,不需要提取出来,加括号 (.*?) 可以提取出括号内的内容,如:

import re
test = "rating5-t"
text = re.findall('rating(.*?)-t', test)
print (text)

输出结果为:

['5']

这里再举一个简单的例子:

在这里插入图片描述

2.匹配数字

比如评价数,我们xpath提取到的数据格式为: 1056830人评价 ,保存的时候只需要数字即可,现在把数字提取出来:

import re 
data = "1059232人评价"
num = re.sub(r'\D', "", data)
print("这里的数字是:", num)

输出结果为:

这里的数字是: 1059232

六.CSV文件操作

我们在使用Python进行网络爬虫或数据分析时,通常会遇到CSV文件,类似于Excel表格。第三篇文章我们详细介绍了CSV文件的操作,保存内容与把大象放进冰箱是一样的,分别为打开冰箱,把大象装进去,关闭冰箱。这里我们进行简单说明。

1.CSV文件写

基本流程如下:

  • 导入CSV模块
  • 创建一个CSV文件对象
  • 写入CSV文件
  • 关闭文件
# -*- coding: utf-8 -*-
import csv

c = open("test-01.csv", "w", encoding="utf8", newline='')  #写文件
writer = csv.writer(c)
writer.writerow(['序号','姓名','年龄'])
 
tlist = []
tlist.append("1")
tlist.append("小明")
tlist.append("10")
writer.writerow(tlist)
print(tlist,type(tlist))
 
del tlist[:]  #清空
tlist.append("2")
tlist.append("小红")
tlist.append("9")
writer.writerow(tlist)
print(tlist,type(tlist))
 
c.close()

输出结果如下图所示:

在这里插入图片描述


2.CSV文件读

基本流程如下:

  • 导入CSV模块
  • 创建一个CSV文件对象
  • 读取CSV文件
  • 关闭文件
# -*- coding: utf-8 -*-
import csv
c = open("test-01.csv", "r", encoding="utf8")  #读文件
reader = csv.reader(c)
for line in reader:
    print(line[0],line[1],line[2])
c.close()

输出结果如下图所示:

在这里插入图片描述

在文件操作中编码问题是最让人头疼的,尤其Python2的时候。但只需要环境编码一致,注意相关转换也能有效解决,而Python3文件读写操作写清楚encoding编码方式就能正常显示。


七.完整代码

1.提取本页所有信息

通过前面的 xpath 只能提取到一条信息,如果我们要提取所有的信息,写一个 for 循环把它遍历出来即可。先复制几个名字的 xpath,如前三个的:

在这里插入图片描述

li 标签前的作为父级,后面的为子集,./ 代替父级的位置,改写为:

li = html_etree.xpath('//*[@id="content"]/div/div[1]/ol/li')
for item in li:
    name = item.xpath('./div/div[2]/div[1]/a/span[1]/text()')[0]
    print (name)

此时的代码如下所示:

# coding:utf-8
# By:Eastmount & ayouleyang 2021-02-25
import requests
from lxml import etree

#设置浏览器代理,它是一个字典
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
        AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
url = 'https://xxxxxx/top250?start=0&filter='

#向服务器发出请求
r = requests.get(url = url, headers = headers).text

#解析DOM树结构
html_etree = etree.HTML(r)
name = html_etree.xpath('//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/span[1]/text()')
print ("这是数组形式:",name)
print ("这是字符串形式:",name[0])

#提取链接
movie_url = html_etree.xpath('//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/@href')
print ("这是数组形式:",movie_url)
print ("这是字符串形式:",movie_url[0])

#提取打分
rating = html_etree.xpath('//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[2]/div/span[1]/@class')
print ("这是数组形式:",rating)
print ("这是字符串形式:",rating[0])

#提取本页所有信息
li = html_etree.xpath('//*[@id="content"]/div/div[1]/ol/li')
for item in li:
    name = item.xpath('./div/div[2]/div[1]/a/span[1]/text()')[0]
    print (name)

2.最终代码

最终代码如下所示:

# coding:utf-8
# By:Eastmount & ayouleyang 2021-02-25
import requests
from lxml import etree
import csv, re

#设置浏览器代理,它是一个字典
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
        AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}

#创建文件夹并打开
fp = open("./DB-top250.csv", 'a', newline='', encoding = 'utf-8-sig')
writer = csv.writer(fp) #写入
writer.writerow(('排名', '名称', '链接', '星级', '评分', '评价人数'))

#循环遍历TOP250的URL
for page in range(0, 226, 25):  #226
    print ("正在获取第%s页"%page)
    url = 'https://xxxxxxx/top250?start=%s&filter='%page
    
    #请求源代码
    reponse = requests.get(url = url, headers = headers).text
    
    #解析DOM树结构
    html_etree = etree.HTML(reponse)
    
    #定位节点 注意迭代xpath应用
    li = html_etree.xpath('//*[@id="content"]/div/div[1]/ol/li')
    for item in li:
        #排名
        rank = item.xpath('./div/div[1]/em/text()')[0]
        #名称
        name = item.xpath('./div/div[2]/div[1]/a/span[1]/text()')[0]
        #链接
        dy_url = item.xpath('./div/div[2]/div[1]/a/@href')[0]
        
        #评分 正则表达式提取
        rating = item.xpath('./div/div[2]/div[2]/div/span[1]/@class')[0]
        rating = re.findall('rating(.*?)-t', rating)[0]
        if len(rating) == 2:
            star = int(rating) / 10  #int()转化为数字
        else:
            star = rating
            
        #评价人数
        rating_num = item.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0]
        content = item.xpath('./div/div[2]/div[2]/div/span[4]/text()')[0]
        content = re.sub(r'\D', "", content)
        #print (rank, name, dy_url, star, rating_num, content)

        #写入内容
        writer.writerow((rank, name, dy_url, star, rating_num, content))
fp.close()

最终保存的文件。


八.总结

在学习网络爬虫之前,读者首先要掌握分析网页节点、审查元素定位标签,甚至是翻页跳转、URL分析等知识,然后才是通过Python、Java或C#实现爬虫的代码。本文作者结合自己多年的网络爬虫开发经验,深入讲解了Requests技术网页分析并爬取了个人博客信息,读者可以借用本章的分析方法,结合Requests库爬取所需的网页信息,并学会分析网页跳转,尽可能爬取完整的数据集。

该系列所有代码下载地址:

2020年在github的绿瓷砖终于贴完了第一年提交2100余次,获得1500多+stars,开源93个仓库,300个粉丝。挺开心的,希望自己能坚持在github打卡五年,督促自己不断前行。简单总结下,最满意的资源是YQ爆发时,去年2月分享的舆情分析和情感分析,用这系列有温度的代码为武汉加油;最高赞的是Python图像识别系列,也获得了第一位来自国外开发者的贡献补充;最花时间的是Wannacry逆向系列,花了我两月逆向分析,几乎成为了全网最详细的该蠕虫分析;还有AI系列、知识图谱实战、CVE复现、APT报告等等。当然也存在很多不足之处,希望来年分享更高质量的资源,也希望能将安全和AI顶会论文系列总结进来,真诚的希望它们能帮助到大家,感恩有你,一起加油~

在这里插入图片描述

(By:娜璋之家 Eastmount 2021-02-25 夜于贵阳 https://blog.csdn.net/Eastmount )


参考文献如下:


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Python从零到壹] 七.网络爬虫之Requests爬取作者个人博客网站及CSV存储 的相关文章

随机推荐

  • PMOS 型的 LDO

    在前面讲 NMOS LDO 的时候 我们注意到 NMOS 由于它的源极和门级之间的导通门限 使 简单构成的 NMOS LDO 它输入和输出之间的压差不可能很小 必须大于这个导通门限 如果 我们引入一个单个的偏置电压对某些应用又是一个负担 因
  • Ag-grid表格 原生javascript的简单使用

    ag grid是支持多种前端框架的企业级表格框架 它能实现的功能也颇多 有兴趣的可以上他的官网api看下ag Grid官网 我这里简单写一下基础的数据初始化生成表格 1 首先引入js文件 我这里用原生的方式 并没有使用vue之类的框架的方法
  • go 进阶 https与http2

    目录 一 复习 https 与 http2 https 是什么 https 原理是什么 http 与https的区别 http2 与http1 x区别 二 golang https http2 基础示例 httputil ReversePr
  • API接口:企业信息核验

    企业信息核验是现代企业管理中必不可少的一项业务 它可以帮助企业做出正确的决策 在这篇文章里 我们将会介绍如何使用API接口来对企业信息进行核验 并实现快捷 准确的查询 一 API接口 在这里我们使用的是挖数据提供的企业信息核验API接口 它
  • opencv-python图形图像处理入门基础知识

    前往老猿Python博文目录 OpenCV 是计算机视觉中经典的专用库 其支持多语言 跨平台 功能强大 OpenCV Python为OpenCV提供了Python接口 使得使用者在Python中能够调用C C 在保证易读性和运行效率的前提下
  • 论在leetcode遇到的奇葩题解

    刷了一上午AcWing 想起来学长说面试更多的还是刷leetcode 于是就打开leetcode官网开始第一次leetcode之旅 当时没考虑太多 直接点进去了 是个中等题 很明显 线性筛嘛 也不难 然后很快就写完 然后我就看到了这个 我敲
  • Mysql数据库的安装教程

    Mysql数据库的安装教程 一 Mysql数据库介绍 二 Mysql数据库特性 1 Mysql现状 2 Mysql的几个特点 三 Mysql数据库中术语介绍 四 检查MySQL 是否安装 1 检测系统是否安装有mysql 五 安装mysql
  • 56-C语言-16进制转10进制

    问题 就是16进制的转10进制 嗯 思路 先手写一下 手推16进制转10进制怎么弄的 写完以后 变成代码 由于之前写过9进制转19进制 因此很多思想一样 这里出现了个新东西 就是10进制以后的进制 出现了字母 因此所输入的数据 变成了字符数
  • C# UDP通讯

    UDP不属于面向连接的通信 在选择协议时 选择UDP必须要谨慎 在网络质量较差情况下 UDP协议数据包丢失会比较严重 但是由于UDP的特性 它不属于连接型协议 具有资源消耗小 处理速度快等优点 所以通常音视频和普通数据在传送时使用UDP较多
  • 【开题报告】ssm电商平台2zag6计算机毕业设计程序

    本项目包含程序 源码 数据库 LW 调试部署环境 文末可获取一份本项目的java源码和数据库参考 开题报告 研究背景 随着互联网技术的迅速发展 电子商务在全球范围内得到了广泛应用和普及 电商平台作为电子商务的重要组成部分 已经成为人们购物的
  • WebStorm修改Tab缩进为2,vue文件也生效,还可以修改webstrom中vue文件回车的4格缩进为2格,亲测可用

    前言 为了 遵循ESLint语法规范 我们需要使用两个空格的tab缩进 使用方法 1 打开设置 找到Code Style 2 找到JavaScript和其他类型 为了vue类型的文件 把数字都改成2 因为vue文件里面有template需要
  • 剑指 Offer 18. 删除链表的节点

    删除链表的节点 思路 先解决特殊条件 package swordPointingToTheOffer public class Eighteen public static class ListNode int val ListNode n
  • XPT2046程序例程(STM32F103C8T6)

    一 前言 本例程是使用XPT2046 AD转换IC采集电位器的数值 并通过串口调试助手打印数据 所使用的是库函数进行编写 二 XPT2046 概述 一 功能说明 XPT2046是一款4线制电阻屏控制器 内含12位分辨率125KHz转换速率逐
  • Review操作系统

    操作系统由什么组成 什么是阻塞IO和非阻塞IO 用户态到内核态怎么切换 中断的原因 进程间的通信方式 同一个机器之间的进程通信哪种最有效 select epllo 2 为什么要分页 你对操作系统内存页有什么了解 为什么要有虚拟内存 有什么用
  • JavaScript学习之ES6学习之Promise

    简介 主要介绍Promise新特性的概念和使用 概念 Promise是ES6引入的异步编程的新解决方案 语法上Promise是一个构造函数 用来封装异步操作 也就是回调函数
  • 面试笔记(四)---怎么去除url地址的参数

    javascript 删除 url 中指定参数 并返回 url 前言 在之前写了一篇博文 javascript 操作 url 中 search 部分方法函数 在这篇博文里面 我们通过写好的函数可以对url中的各种参数进行查询 设置 唯独 忘
  • Android自动调整字体大小的TextView

    文章目录 一 前言 二 设置 TextView 文本自动调整大小 2 1 默认缩放 2 2 按粒度缩放 2 3 按预设定值缩放 三 使用支持库实现文本自动缩放 一 前言 在应用开发过程中 可能需要这样的场景 一个现实区域有限的TextVie
  • 用Cmake build OpenCV后,在VS中查看OpenCV源码的方法(环境VS2022+openCV4.8.0) Part III

    用Cmake build OpenCV后 在VS中查看OpenCV源码的方法 环境VS2022 openCV4 8 0 Part III 用Cmake build OpenCV后 在VS中查看OpenCV源码的方法 环境VS2022 ope
  • python卷积神经网络手写数字识别_TensorFlow.js 卷积神经网络手写数字识别

    源码 demo 调整训练集的大小 观察测试结果的准确性 数据来源 数据来源与 https www kaggle com 中的一道题目 digit recognizer 题目给出42000条训练数据 包含图片和标签 以及28000条测试数据
  • [Python从零到壹] 七.网络爬虫之Requests爬取作者个人博客网站及CSV存储

    欢迎大家来到 Python从零到壹 在这里我将分享约200篇Python系列文章 带大家一起去学习和玩耍 看看Python这个有趣的世界 所有文章都将结合案例 代码和作者的经验讲解 真心想把自己近十年的编程经验分享给大家 希望对您有所帮助