python反爬虫模块fake_useragent

Python3 fake_useragent 模块的使用和报错解决方案

https://blog.csdn.net/yilovexing/article/details/89044980?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-89044980-blog-105354439.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-89044980-blog-105354439.pc_relevant_default&utm_relevant_index=1

在使用 Python 做爬虫的时候,我们需要伪装头部信息骗过网站的防爬策略,Python 中的第三方模块 fake_useragent 就很好的解决了这个问题,它将给我们返回一个随机封装了好的头部信息,我们直接使用即可

fake_useragent 的使用

安装 fake_useragent

pip install fake_useragent
1
示例:

from fake_useragent import UserAgent

实例化 UserAgent 类

ua = UserAgent()

对应浏览器的头部信息

print(ua.ie)
print(ua.opera)
print(ua.chrome)
print(ua.firefox)
print(ua.safari)

随机返回头部信息,推荐使用

print(ua.random)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
运行结果:

(adnice) adnice:Downloads zhangyi$ python3 fake.py
Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; SLCC1; .NET CLR 1.1.4322)
Opera/9.80 (Windows NT 6.1; U; fi) Presto/2.7.62 Version/11.00
Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1500.55 Safari/537.36
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:23.0) Gecko/20131011 Firefox/23.0
Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27
Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2117.157 Safari/537.36
1
2
3
4
5
6
7
fake_useragent 报错及解决方案

报错信息:

socket.timeout: timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “d:\programdata\anaconda3\lib\site-packages\fake_useragent\utils.py”, lin
e 166, in load
verify_ssl=verify_ssl,
File “d:\programdata\anaconda3\lib\site-packages\fake_useragent\utils.py”, lin
e 122, in get_browser_versions
verify_ssl=verify_ssl,
File “d:\programdata\anaconda3\lib\site-packages\fake_useragent\utils.py”, lin
e 84, in get
raise FakeUserAgentError(‘Maximum amount of retries reached’)
fake_useragent.errors.FakeUserAgentError: Maximum amount of retries reached
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
首先找出关键报错信息:

fake_useragent.errors.FakeUserAgentError: Maximum amount of retries reached
1
大概意思是:这个模块尝试请求一个东西已达到最大重试次数

打开这个模块的源码进行查看发现这个库会引用在线资源,所以这个模块是进行几次尝试请求一个网站的 Json 数据,但是因为各种原因请求超时,所以就会报这个错误

fake_useragent\settings.py

– coding: utf-8 –

from future import absolute_import, unicode_literals

import os
import tempfile

version = ‘0.1.11’

DB = os.path.join(
tempfile.gettempdir(),
‘fake_useragent_{version}.json’.format(
version=version,
),
)

CACHE_SERVER = ‘https://fake-useragent.herokuapp.com/browsers/{version}’.format(
version=version,
)

BROWSERS_STATS_PAGE = ‘https://www.w3schools.com/browsers/default.asp’

BROWSER_BASE_PAGE = ‘http://useragentstring.com/pages/useragentstring.php?name={browser}’ # noqa

BROWSERS_COUNT_LIMIT = 50

REPLACEMENTS = {
‘ ‘: ”,
‘_’: ”,
}

SHORTCUTS = {
‘internet explorer’: ‘internetexplorer’,
‘ie’: ‘internetexplorer’,
‘msie’: ‘internetexplorer’,
‘edge’: ‘internetexplorer’,
‘google’: ‘chrome’,
‘googlechrome’: ‘chrome’,
‘ff’: ‘firefox’,
}

OVERRIDES = {
‘Edge/IE’: ‘Internet Explorer’,
‘IE/Edge’: ‘Internet Explorer’,
}

HTTP_TIMEOUT = 5

HTTP_RETRIES = 2

HTTP_DELAY = 0.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
解决方案:

首先第一步要进行更新 fake_useragent

pip install –upgrade fake_useragent
1

  1. 在实例化的时候指定一些参数

禁用服务器缓存

ua = UserAgent(use_cache_server=False)
1
不缓存数据

ua = UserAgent(cache=False)
1
忽略ssl验证

ua = UserAgent(verify_ssl=False)
1
一般的话,通过上述解决方案都能解决了,但是我就比较悲催了,还是没解决…

  1. 使用临时 Json 文件

在 fake_useragent\settings.py 发现了几个 URL,其中有一些是打不开的,所以,我们将能打开的 URL 的 Json 文件保存在本地

wget https://fake-useragent.herokuapp.com/browsers/0.1.11
1
这时我们就会得到一个 0.1.11 的文件,将文件名改为 fake_useragent_0.1.11.json

mv 0.1.11 fake_useragent_0.1.11.json
1
然后找到我们的临时文件目录(每个系统都不一样,例如 Ubuntu 在 /tmp 下)

(edison) adnice:T zhangyi$ python3
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 16:52:21)
[Clang 6.0 (clang-600.0.57)] on darwin
Type “help”, “copyright”, “credits” or “license” for more information.

import tempfile
tempfile.gettempdir()
‘/var/folders/6_/p67xz49j5wd5lzx7s2cz1cdr0000gn/T’

1
2
3
4
5
6
7
8
最后将文件拷贝到临时目录中即可

cp fake_useragent_0.1.11.json /var/folders/6_/p67xz49j5wd5lzx7s2cz1cdr0000gn/T/
1
当我们再次实例化 UserAgent 的时候,就会先读取本地的临时文件,这样实例化的时候就不会报错了

参考文章:https://blog.csdn.net/huiyanshizhu/article/details/84952093

python 监控网站是否正常工作

#-*- coding: utf-8 -*
import requests
from lxml import etree

#请求头和目标网址
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36'
}
##url = 'https://www.jianshu.com/u/472a595d244c'
url = 'http://www.mixdiy.com'
#第二种写法的 xpath
#获取所有 li标签
xpath_items = '//body[@class="home blog wp-custom-logo wp-embed-responsive"]/div'
#对每个 li标签再提取
xpath_link = './footer/div/a/@href'
xpath_title = './footer/div/a/text()'
##xpath_comment_num = './/div[@class="meta"]/a[2]/text()'
##xpath_heart_num = './/div[@class="meta"]/span/text()'

#获取和解析网页
r = requests.get(url, headers=headers)
r.encoding = r.apparent_encoding
dom = etree.HTML(r.text)

#获取所有的文章标签
items = dom.xpath(xpath_items)

#分别对每一个文章标签进行操作 将每篇文章的链接 标题 评论数 点赞数放到一个字典里
data = []
for article in items:
    t = {}
    t['link'] = article.xpath(xpath_link)[0]
    t['title'] = article.xpath(xpath_title)[0]
    #comment_num对应的标签里有两个文本标签 用 join方法将两个文本拼接起来
    #strip()方法去除换行和空格
##    t['comment_num'] = ''.join(article.xpath(xpath_comment_num)).strip()
##    t['heart_num'] = article.xpath(xpath_heart_num)[0].strip()
    data.append(t)

#打印结果
print(data[0]['link'])

if 'mixdiy.com' in data[0]['link']:
    print('online')
else:
    print('offline')

python网络爬虫

https://www.jianshu.com/p/ff37a8524e72

一、前言

上一节我们讲了怎么批量下载壁纸,虽然爬虫的代码很简单,但是却有一个很重要的问题,那就是 xpath路径应该怎么写。

这个问题往往会被我们忽略,但 xpath路径的写法是很重要的。不同的 xpath路径写法会后续爬取代码会产生很大影响,而且不同的 xpath写法的稳定性也不同,能不能写出优雅稳定的代码就要看 xpath写得好不好了。

下面我们来讲讲为什么 xpath的写法这么重要

二、为什么 xpath写法很重要

我们拿几个例子来讲讲不同 xpath写法对代码的影响,以我的个人主页作为解析对象:

python爬虫猫的个人主页

现在的需求是要爬取我个人主页里的文章列表,包括文章的链接、标题、访问量、评论数和点赞数量

个人主页

爬之前我们先分析一下

1、爬什么:文章链接文章的链接、标题、评论数和点赞数量

2、怎么爬:requests请求网页、xpath解析网页

接下来正式开始爬取:

第一步:分析网页,写出图片的 xpath路径

第二步:用 requests库获取网页

第三步:使用 lxml库解析网页

第四步:把爬取到的信息保存下来

我们一步一步来,首先分析网页,写出 xpath

按 F12进入开发者模式,找到文章列表所在的标签

example-2.png

可以看到,文章列表是一个 ul标签,ul标签下的每一个 li标签分别代表一篇文章。

我们要爬的信息都在 class=”content”的 div标签下:

  • 文章链接是第一个 a标签的 herf属性值
  • 文章标题是第一个 a标签的文本属性的值
  • 文章的评论数是 class=”meta”的 div标签下的第二个 a标签下的文本值
  • 文章点赞数量是 class=”meta”的 div标签下的 span标签下的文本值

这时候 xpath有很多种写法,我写出其中的两种,一好一坏,大家可以试着判断一下哪个好哪个坏

第一种写法:

xpath_link = '//ul[@class="note-list"]/li/div/a/@href'
xpath_title = '//ul[@class="note-list"]/li/div/a/text()'
xpath_comment_num = '//ul[@class="note-list"]/li/div/div[@class="meta"]/a[2]/text()'
xpath_heart_num = '//ul[@class="note-list"]/li/div/div[@class="meta"]/span/text()'

第二种写法:

#获取所有 li标签
xpath_items = '//ul[@class="note-list"]/li'
#对每个 li标签再提取
xpath_link = './div/a/@href'
xpath_title = './div/a/text()'
xpath_comment_num = './/div[@class="meta"]/a[2]/text()'
xpath_heart_num = './/div[@class="meta"]/span/text()'

写好 xpath之后,我们开始第二步,获取网页

获取简书的网页如果我们还像之前那样直接请求的话,就会得到一个 403错误,这是因为没有设置请求头。

加上请求头就能解决了[]( ̄▽ ̄)*

第一种 xpath写法对应的代码:

#-*- coding: utf-8 -*
import requests
from lxml import etree


#请求头和目标网址
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36'
}
url = 'https://www.jianshu.com/u/472a595d244c'

#第一种写法的 xpath
xpath_link = '//ul[@class="note-list"]/li/div/a/@href'
xpath_title = '//ul[@class="note-list"]/li/div/a/text()'
xpath_comment_num = '//ul[@class="note-list"]/li/div/div[@class="meta"]/a[2]/text()'
xpath_heart_num = '//ul[@class="note-list"]/li/div/div[@class="meta"]/span/text()'

#获取和解析网页
r = requests.get(url, headers=headers)
r.encoding = r.apparent_encoding
dom = etree.HTML(r.text)

#所有的 链接 标题 评论数 点赞数
links = dom.xpath(xpath_link)
titles = dom.xpath(xpath_title)
comment_nums = dom.xpath(xpath_comment_num)
heart_nums = dom.xpath(xpath_heart_num)

#将每篇文章的链接 标题 评论数 点赞数放到一个字典里
data = []
for i in range(len(links)):
    t = {}
    t['link'] = links[i]
    t['title'] = titles[i]
    t['comment_num'] = comment_nums[i].strip()
    t['heart_num'] = heart_nums[i].strip()
    data.append(t)

#打印结果
for t in data:
    print(t)



运行结果如下:

example-3

可以看到,第一篇和第三篇的 comment_num 没有获取到

第二种 xpath写法对应的代码:

#-*- coding: utf-8 -*
import requests
from lxml import etree


#请求头和目标网址
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36'
}
url = 'https://www.jianshu.com/u/472a595d244c'

#第二种写法的 xpath
#获取所有 li标签
xpath_items = '//ul[@class="note-list"]/li'
#对每个 li标签再提取
xpath_link = './div/a/@href'
xpath_title = './div/a/text()'
xpath_comment_num = './/div[@class="meta"]/a[2]/text()'
xpath_heart_num = './/div[@class="meta"]/span/text()'


#获取和解析网页
r = requests.get(url, headers=headers)
r.encoding = r.apparent_encoding
dom = etree.HTML(r.text)

#获取所有的文章标签
items = dom.xpath(xpath_items)

#分别对每一个文章标签进行操作 将每篇文章的链接 标题 评论数 点赞数放到一个字典里
data = []
for article in items:
    t = {}
    t['link'] = article.xpath(xpath_link)[0]
    t['title'] = article.xpath(xpath_title)[0]
    #comment_num对应的标签里有两个文本标签 用 join方法将两个文本拼接起来
    #strip()方法去除换行和空格
    t['comment_num'] = ''.join(article.xpath(xpath_comment_num)).strip()
    t['heart_num'] = article.xpath(xpath_heart_num)[0].strip()
    data.append(t)

#打印结果
for t in data:
    print(t)



运行结果:

example-4

这里 comment_num成功获得了

仅仅从获取的结果来看,我们就可以判断第二种 xpath写法更好。

为什么第二种写法更好呢?

因为第二种方法把每一篇文章看作一个对象,这样后续的处理都是以对象为基本单位,对数据进行处理的时候过程更加清晰。

而第一种写法把链接、标题、评论数和点赞数量这四个分别用列表存储,这样虽然同样可以获得结果,但是再进行数据处理的时候就需要考虑怎么才能不破坏四个变量之间的一一对应关系。

用第二种方法就没有这个问题,因为在处理数据的时候它们都被看作同一个对象的组成部分,这本身就蕴含着蕴含着一种关系。

现在问题来了,平时我们在爬取数据的时候,怎么才能判断哪些数据是同一个对象呢?

这个其实很简单,在我们分析需求的时候就已经知道了,我们所需要数据的一个完整组合就是一个对象。

比如在本文的例子里,我们要爬取链接、标题、评论数和点赞数量,那么{链接,标题,评论数,点赞数量}就是一个对象。。

rc.local 使用python注意事项

在rc.local中使用python程序,一个注意事项是,加入在rc.local中如需sudo 运行python,则python的导入模块也需要用sudo install,否则会出现找不到模块的错误。

备份wordpress经验总结

wordpress网站备份总结

1、压缩/var/www/html目录

2、如果压缩文件很大则分割后再传输

3、在wordpress后台使用导出工具导出xml备份文件

4、将html目录压缩文件和导出的xml文件拷贝到新站

5、使用cat组合分割的压缩文件并解压到html目录下(解压前删除html下的所有文件)

6、创建wordpress数据库

7、访问站点并进入wordpress后台导入备份的xml文件

注:

前提条件是在新的系统上已经配置好环境(包括php、sql)

如何修复WordPress图片裁剪错误

我们现在知道错误的样子。让我们进一步了解如何修复图像裁剪错误。

作为故障排除的第一步,我们检查服务器的PHP版本以及GD库。如果缺少GD库,我们安装它。但是,GD安装步骤因服务器类型而异。

对于RedHat/CentOS主机,我们运行命令

yum install php-gd

或者,如果是Ubuntu服务器,GD安装使用

apt-get install php-gd

在这里,我们还要确保WordPress软件包的版本与主机的PHP版本相匹配。

最后,要制作新安装的GD库,需要重启web服务器。我们在服务器中通过

/etc/init.d/httpd restart

修复错误后,在“媒体库”中,用户可以选择图像并“插入文章”,完美解决问题。

树莓派清华源镜像

Raspbian 镜像使用帮助

使用说明

首先通过 uname -m 确定你使用的系统的架构。选择你的 Raspbian 对应的 Debian 版本:  Debian 9 (stretch) Debian 10 (buster) Debian 11 (bullseye) 

sudo nano /etc/apt/sources.list

# aarch64 用户,用以下内容取代:
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
sudo nano /etc/apt/sources.list.d/raspi.list

# 编辑 `/etc/apt/sources.list.d/raspi.list` 文件,删除原文件所有内容,用以下内容取代:
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ bullseye main

注意:网址末尾的raspbian重复两次是必须的。因为 Raspbian 的仓库中除了APT软件源还包含其他代码。APT软件源不在仓库的根目录,而在raspbian/子目录下。

编辑镜像站后,请使用sudo apt-get update命令,更新软件源列表,同时检查您的编辑是否正确。

相关链接

Raspbian 链接

树莓派链接

backup wordpress website

https://www.themepark.com.cn/wzdjwordpresswzsjbf.html#:~:text=一般来说wordpress网站的数据包括2个方面,这两个都需要单独备份%E3%80%82,一个是文件,也就是你上传安装的主题、插件以及文章中的图片和其他附件,这些我们在服务器或者虚拟主机上直接压缩下载备份即可%E3%80%82%20另一个是数据库,数据库是你的网站所有的设置,包括你的文章设置、菜单、主题选项、管理员账号密码等等信息都是保存在数据库中的%E3%80%82

wordpress完整的数据备份

我们在使用wordpress进行建站的时候,当网站建立完成之后,我们需要将网站的数据进行备份,以防止当网站服务器数据丢失,或者其他情况导致的数据丢失。

因此网站数据备份是非常重要的,如果遇到这种情况,我们辛辛苦苦制作好并上传好资料的网站,如果没有备份,那么就永远丢失找不回来啦。

因此这里我们介绍如何完整的备份好你的数据。

一般来说wordpress网站的数据包括2个方面,这两个都需要单独备份。

一个是文件,也就是你上传安装的主题、插件以及文章中的图片和其他附件,这些我们在服务器或者虚拟主机上直接压缩下载备份即可。

另一个是数据库,数据库是你的网站所有的设置,包括你的文章设置、菜单、主题选项、管理员账号密码等等信息都是保存在数据库中的。

完整的将网站数据进行备份

1.网站文件的备份

首先,我们需要将我们网站上所有的文件进行备份,找到你的网站根目录,一般来说根目录的名称是www、htdocs、wwwroot、public_html等等,

如果你找不到哪一个是根目录,那么可以逐个打开目录,查看目录下是否有三个文件夹wp-content、wp-admin、wp-includes三个文件夹,那么就是wordpress的根目录了。

找到根目录之后,将整个目录文件夹压缩为zip压缩包格式,下载到本地的电脑上进行保存,这样我们的文件就全部保存好了。

2.网站数据库的备份

网站数据库的备份需要你进入你的数据库管理。一般找到服务器数据库管理可以找到,大部分的服务器是使用phpmyadmin进行管理的,这里我们也使用phpmyadmin为例子进行介绍。

首先进入phpmyadmin,找到你的数据库,如果你不知道你的网站是安装在哪一个数据库的 ,那么可以看看下面的图片,这样的数据库结构就是你的wordpress网站数据:

完整的将wordpress网站数据备份

如上图所示,这就是你的wordpress网站数据,如果你安装了多了wordpress网站,有多个这样的数据库,不知道哪一个是想要备份的,那么在左侧上图找到wp-options,点击一下进入这个表

可以看到两个数据,一个是home,一个是siteurl,还有可以看到你的网站标题和副标题,这样就很容易找到了:

完整的将wordpress网站数据备份

找到你想要的数据库之后,退出这个options表,进入整个表单的列表 ,如上图所示,可以点击一下红框中的链接进入:

完整的将wordpress网站数据备份

然后点击导出按钮,进入导出界面后选择选择自定义:

完整的将wordpress网站数据备份

在下面的兼容选择一下myslq323 兼容模式:

完整的将wordpress网站数据备份

然后在最后点击导出即可得到备份的sql文件。

这里需要注意的是,因为mysql不同的版本导入的数据可能出现问题,因此最大兼容旧版本可以导出多个版本进行备份,

这是以防止你的数据要迁移到别的数据库进行导入时遇到的问题,如果你只是单纯的备份,那么这里可以不需要选择最大兼容。

这两个文件保存在自己的电脑上进行备份,这样我们的数据就完全的导入完成了,明天我们将出一篇教程,如何将我们的备份数据进行恢复,届时你可以点击下一篇文章进行阅读。

压缩目录

1、把/home目录下面的mydata目录压缩为mydata.zip
zip -r mydata.zip mydata #压缩mydata目录
2、把/home目录下面的mydata.zip解压到mydatabak目录里面
unzip mydata.zip -d mydatabak
3、把/home目录下面的abc文件夹和123.txt压缩成为abc123.zip
zip -r abc123.zip abc 123.txt
4、把/home目录下面的wwwroot.zip直接解压到/home目录里面
unzip wwwroot.zip
5、把/home目录下面的abc12.zip、abc23.zip、abc34.zip同时解压到/home目录里面
unzip abc*.zip
6、查看把/home目录下面的wwwroot.zip里面的内容
unzip -v wwwroot.zip
7、验证/home目录下面的wwwroot.zip是否完整
unzip -t wwwroot.zip
8、把/home目录下面wwwroot.zip里面的所有文件解压到第一级目录
unzip -j wwwroot.zip

主要参数

-c:将解压缩的结果
-l:显示压缩文件内所包含的文件
-p:与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换
-t:检查压缩文件是否正确
-u:与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其它文件解压缩到目录中
-v:执行是时显示详细的信息
-z:仅显示压缩文件的备注文字
-a:对文本文件进行必要的字符转换
-b:不要对文本文件进行字符转换
-C:压缩文件中的文件名称区分大小写
-j:不处理压缩文件中原有的目录路径
-L:将压缩文件中的全部文件名改为小写
-M:将输出结果送到more程序处理
-n:解压缩时不要覆盖原有的文件
-o:不必先询问用户,unzip执行后覆盖原有文件
-P:使用zip的密码选项
-q:执行时不显示任何信息
-s:将文件名中的空白字符转换为底线字符
-V:保留VMS的文件版本信息
-X:解压缩时同时回存文件原来的UID/GID