lagrange's blog

what's dead may never die

0%

在上方BUPT资源的标签处,你可以转到我一个GitHub的仓库,里面包含了很多的资料,有些文件太大GitHub不允许上传,虽然有一些关于这个问题的解决方案,但毕竟会对下载的用户造成不必要的麻烦。所以剩下的内容以百度云链接的形式给出 链接: https://pan.baidu.com/s/1eUL6GhrOrc29VWwnBlUv1A 提取码: tpb9 复制这段内容后打开百度网盘手机App,操作更方便哦

与上一篇一样,这篇主要记录使用服务器中遇到的问题以及问题是如何被解决的。本文长期更新

  1. scp作为与服务器上传下载文件的命令非常实用 如上传下载服务器中的文件到电脑 但一次在使用过程中爆出No such file or directory 的错误 scp hostname@ip:serverpath computer_path hostname@ip:serverpath's password: computer_path: No such file or directory 解决方法:是在本地终端使用scp命令而不是登录了远程服务端再使用,本操作需要退出服务器终端

由于是现用服务器搭网站在这个过程中了解到了越来越多的linux命令,记录下来,防止遗忘, 本文长期更新

  1. 解压与压缩 压缩:tar -cvf XXX.tar path 解压:tar -xvf XXX.tar

  2. 使用du命令查看文件或文件夹的磁盘使用空间 –max-depth 用于指定深入目录的层数。如要查看当前目录已经使用总大小及当前目录下一级文件或文件夹各自使用的总空间大小, 输入du -h –max-depth=1即可。

    如要查看当前目录已使用总大小可输入:du -h –max-depth=0

  3. 有关apache服务: 一、Start Apache 2 Server /启动apache服务 /etc/init.d/apache2 start 需要root权限 or $ sudo /etc/init.d/apache2 start 二、 Restart Apache 2 Server /重启apache服务 /etc/init.d/apache2 restart 需要root权限 or $ sudo /etc/init.d/apache2 restart 三、Stop Apache 2 Server /停止apache服务 /etc/init.d/apache2 stop 需要root权限 or $ sudo /etc/init.d/apache2 stop

  4. 服务器上部署python程序使即使退出ssh,程序仍能继续运行

    1.nohup python3 -u test.py >test.log 2>&1 &

    2.回车

    3.输入exit命令退出终端

    4.关闭shell 注意:不能直接退出终端 其中,

    1. 最后一个“&”表示后台运行程序

    2. “nohup” 表示程序不被挂起

    3. “python”表示执行python代码

    4. “-u”表示不启用缓存,实时输出打印信息到日志文件(如果不加-u,则会导致日志文件不会实时刷新代码中的print函数的信息)

    5. “test.py”表示python的源代码文件

    6. “test.log”表示输出的日志文件

    7. “>”表示将打印信息重定向到日志文件

    8. “2>&1”表示将标准错误输出转变化标准输出,可以将错误信息也输出到日志文件中(0-> stdin, 1->stdout, 2->stderr) 有两个命令可以用,jobs和ps,区别是jobs用于查看当前终端后台运行的任务,换了终端就看不到了。而ps命令用于查看瞬间进程的动态,可以看到别的终端运行的后台进程。 查看后台应用 (1)jobs命令 功能:查看当前终端后台运行的任务 jobs -l选项可显示当前终端所有任务的PID,jobs的状态可以是running,stopped,Terminated。+ 号表示当前任务,- 号表示后一个任务。 (2)ps命令功能:查看当前的所有进程

    9. cp(copy)命令 该命令的功能是将给出的文件或目录拷贝到另一文件或目录中。 语法: cp [选项] 源文件或目录 目标文件或目录 说明:该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中。 该命令的各选项含义如下:

      • a 该选项通常在拷贝目录时使用。它保留链接、文件属性,并递归地拷贝目录,其作用等于dpR选项的组合。
      • d 拷贝时保留链接。
      • f 删除已经存在的目标文件而不提示。
      • i 和f选项相反,在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,是交互式拷贝。
      • p 此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中。
      • r 若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名。
      • l 不作拷贝,只是链接文件。   需要说明的是,为防止用户在不经意的情况下用cp命令破坏另一个文件,如用户指定的目标文件名已存在,用cp命令拷贝文件后,这个文件就会被新源文件覆盖,因此,建议用户在使用cp命令拷贝文件时,最好使用i选项

第一次写博客,没什么好写的,贴上个学期用python爬壁纸网站的代码出来吧。 一开始是逛知乎的时候看见的这个壁纸网站facets 点开看见里面壁纸还行,就打算写python把网站所有壁纸给爬下来 先贴代码

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
from threading import Thread
import time
import os
import re
from bs4 import BeautifulSoup
import requests

link = "http://www.facets.la/wallpaper/W"

class Spider(Thread):
def __init__(self, url):
super(Spider, self).__init__()
self.url = url
self.download = []

def run(self):
self.get_link()

def get_link(self):
html = requests.get(self.url)
soup = BeautifulSoup(html.text, 'lxml')
for item in soup.find_all(class_={"thumb", 'thumb-large'}):
url = item.find('img').get('src') #抓取到的是缩略图的url,与实际的url存在对应关系
url = link + url[url.find('_'):]
name = item.find('span', attrs={"style": "font-weight: 400;"}).text
if url is not None:
dic = {'name': name, 'pic': url}
self.download.append(dic)
global start
print("在%d秒内完成对网页%s的图片链接抓取,开始下载" % (time.time() - start, self.url))
for dic in self.download:
filename = dic['name'] + '.jpg'
print('downloading....:%s' % dic['name'])
try: #有可能会出现抓取的图片带有不能够作为路径名的字符
with open('python_download_picture/' + filename, 'wb') as f:
img = requests.get(dic['pic']).content
f.write(img)
except Exception as e:
print(e, filename)
global error_count
filename = "picture" + str(error_count) + ".jpg"
error_count += 1
print("rename as %s" % filename)
with open('python_download_picture/' + filename, 'wb') as f:
img = requests.get(dic['pic']).content
f.write(img)

def main():
if not os.path.exists("python_download_picture"):
os.mkdir("python_download_picture")
url_list = ['http://www.facets.la/'] #定义url_list用于储存目标网页
process_list = [] # 定义process_list用于储存线程
for num in range(63, 316, 63):
url = "http://www.facets.la/offset/" + str(
num) + '/' # store mission information
url_list.append(url)
for url in url_list:
p = Spider(url)
p.start()
process_list.append(p)
p.join()

if __name__ == "__main__":
start = time.time()
error_count = 0 #记录下载错误数
main()
print("finish in %d seconds" % (time.time() - start))

下面正式讲述爬取过程:

  1. 网站分析 file 观察网站 前三页网站的url分别为: http://www.facets.la http://www.facets.la/offset/63/ http://www.facets.la/offset/126/ 可以看到每一页url递增63,最后一页的网址是 http://www.facets.la/offset/315/ 所以可以用一个列表来储存所有待爬取的url网址, 对应上述代码

    1
    2
    3
    4
    5
    url_list = ['http://www.facets.la/']  #定义url_list用于储存目标网页
    for num in range(63, 316, 63):
    url = "http://www.facets.la/offset/" + str(
    num) + '/' # store mission information
    url_list.append(url)

    2.网页元素分析 使用chrome自带的审查元素分析 所有带有图片链接的名称和图片的div标签class为”thumb”, ‘thumb-large’,第一张比较特殊是’thumb-large’,后面都是”thumb” file 但注意看这个只是缩略图图片链接为 http://www.facets.la/fullview/F_2014_365.jpg 但是当你点进图片看见download paper对应的元素链接却应该是http://www.facets.la/wallpaper/W\_2014\_365.jpg 观察几个图片能够发现完整图片的前缀一定是“**http://www.facets.la/wallpaper/W**”再加入缩略图最后一个大写字母之后的元素 如上一张图片的元素是“_2014_365.jpg” 搞定图片链接之后 图片的名称就比较好搞定,检查元素一点可以看到 每一个图片第一幅agent j为例,包含名字的html为 <span style="font-weight: 400;">Agent J</span>只要选出style=”font-weight: 400;”的span标签即可 使用beautifulsoup库解析如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    html = requests.get(self.url)
    soup = BeautifulSoup(html.text, 'lxml')
    for item in soup.find_all(class_={"thumb", 'thumb-large'}):
    url = item.find('img').get('src') #抓取到的是缩略图的url,与实际的url存在对应关系
    url = link + url[url.find('_'):]
    name = item.find('span', attrs={"style": "font-weight: 400;"}).text
    if url is not None:
    dic = {'name': name, 'pic': url}
    self.download.append(dic)
  2. 注意事项 由于是爬取图片名称直接给图片命名,有可能爬下来的图片名称会带有‘?’等一些不能够使用作为路径名特殊字符,在进行命名时候使用try-except捕获这种错误并对其进行单独命名 4.正式开始爬取网站 在爬取过程中使用了python中的Thread类,使用Spider类重写run方法,具体过程不再赘述,贴几篇看多线程时看过的博客 [python采用 多进程/多线程/协程 写爬虫以及性能对比][python采用 多进程/多线程/协程 写爬虫以及性能对比]

[python采用 多进程/多线程/协程 写爬虫以及性能对比]: https://www.cnblogs.com/huangguifeng/p/7632799.html “python采用 多进程/多线程/协程 写爬虫以及性能对比”