python简单爬虫

Posted 墨紫羽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python简单爬虫相关的知识,希望对你有一定的参考价值。

最近小组内部需要做一个简单小分享,不知道要分享什么,最后决定要做一次爬虫的小分享,哈哈,我也是一个初学者,于是就开始找资料,这里就把我一个简单小分享在这里描述一下

 

首先,我们要知道什么是爬虫,我的理解是:用代码模拟人的操作,去其他网站找到需要的东西,然后爬取下来

所以就需要先知道要爬取内容的网站地址,然后才能去爬取

这里是一个简单小爬虫:

技术图片
# 1、简单爬虫,不做任何处理
import requests  # 导入用来爬虫的包
URL="https://www.baidu.com"  # 请求地址
req = requests.get(URL)  # 开始请求
print(req.text)  # 把请求的数据打印
View Code

这里是直接爬取了一个网页,没有做任何的处理,这肯定是不行的,这样数据还是需要我们自己从里面找。

所以这又把代码稍微改进了一点

技术图片
 2、简单处理,抓取自己想要的东西
import requests
from bs4 import BeautifulSoup

URL = "https://www.biqiuge.com/paihangbang/"
req = requests.get(url=URL)
req_txt = req.text
bs = BeautifulSoup(req_txt, "html.parser")
for i in bs.find_all("div", class_="block bd"):
    print(i.text)
View Code

这里是爬取了笔趣阁的小说的排行,这样的数据其实我们就可以直接看懂了,直接可以使用了

你以为就这样结束了,不不不,没那么简单

总所周知,很多网站是反爬取的,这样我们就需要做一下简单的处理了,例如知乎网,我们像上面那样直接爬取就是不行的

所以,我们加入了一个请求头,其他更复杂的反爬取这里就不讲了

技术图片
# 3、携带请求头
# 部分网站直接访问不通,需要加上请求头,如:知乎:
import requests

# 请求头字典
headers = {
    user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36
}
# 在get请求内,添加user-agent
response = requests.get(url=https://www.zhihu.com/explore, headers=headers)
print(response.status_code)  # 200
print(response.text)
with open(zhihu.html, w, encoding=utf-8) as f:  #创建一个zhihu.html文件
    f.write(response.text)
View Code

那么文字的爬取就到这里了,其他的更深的我也不会

下面我在讲一下图片的爬取

技术图片
# 简单的爬取图片,只爬取一张
import requests

# 这是一个图片的url
url = https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1596560238680&di=0b9fd395e131fc1df9d992b1c33f3c70&imgtype=0&src=http%3A%2F%2Ft7.baidu.com%2Fit%2Fu%3D3616242789%2C1098670747%26fm%3D79%26app%3D86%26f%3DJPEG%3Fw%3D900%26h%3D1350
response = requests.get(url)
# 获取的文本实际上是图片的二进制文本
img = response.content
# 将他拷贝到本地文件 w 写  b 二进制  wb代表写入二进制文本
with open(./a.jpg, wb) as f:
    f.write(img)
View Code

这个是一个简单爬取图片的代码,而且一次只能爬取一张,爬取之后再换URL,在爬取,还不如手动下载来的快

所以批量下载就来了

技术图片
import re
import requests


def download(html):
    # 通过正则匹配
    pic_url = re.findall("objURL":"(.*?)",, html, re.S)
    i = 1
    for key in pic_url:
        print("开始下载图片:" + key + "
")
        try:
            pic = requests.get(key, timeout=10)
        except requests.exceptions.ConnectionError:
            print(图片无法下载)
            continue
        # 保存图片路径
        dir = 保存路径 + str(i) + .jpg
        fp = open(dir, wb)
        fp.write(pic.content)
        fp.close()
        i += 1


def main():
    url = "https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1596723403215_R&pv=&ic=0&nc=1&z=&hd=&latest=&copyright=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&sid=&word=%E5%88%98%E4%BA%A6%E8%8F%B2"
    result = requests.get(url)
    download(result.text)


if __name__ == __main__:
    main()
View Code

图片爬取也就这样了

下面我们来一下综合的,就是文字和图片都要爬取的,那就爬取一个豆瓣的电影排行榜吧

技术图片
import json
import os
import requests
from bs4 import BeautifulSoup

# 请求头
headers = {
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36
}
# 请求URL
url = "https://movie.douban.com/ithil_j/activity/widget/987"
req = requests.get(url=url, headers=headers)

# 进行Unicode解码
req_txt = req.text.encode(utf8).decode(unicode_escape)

# 把接口返回的结果转换为dict
dict_req = json.loads(req_txt)

# 取出subjes
sub_list = dict_req[res][subjects]

# 把subjes转换为dict
dd = {i: v for i, v in enumerate(sub_list)}

for j in dd.keys():
    title = dd[j][title]
    cover = dd[j][cover]
    rating = dd[j][rating]
    url_sub = dd[j][url]
    req_cover = requests.get(url=cover)
    req_rating = requests.get(url=url_sub, headers=headers)

    # 获取的文本实际上是图片的二进制文本
    img = req_cover.content

    # 创建文件夹
    b = os.getcwd()  # 返回当前进程的工作目录
    path = b + "/movie/" + str(rating) + title
    ispath = os.path.exists(path)  # 判断一个目录是否存在
    if ispath == False:
        os.makedirs(path)  # 创建目录
        os.makedirs(path + "/" + title + "演员")
        img_path = os.path.exists(path + "/" + title + .jpg)
        # 将他拷贝到本地文件 w 写  b 二进制  wb代表写入二进制文本
        if img_path == False:
            with open(path + "/" + title + .jpg, wb) as f:
                f.write(img)

    # 找到简介的页面标签
    bf = BeautifulSoup(req_rating.text, "html.parser")
    text2 = bf.find(span, property=v:summary)

    # 把简介写入TXT文档
    file_handle = open(path + "/" + title + -简介.txt, mode=w, encoding=utf-8)
    file_handle.write(text2.text)

    movie_title = bf.findAll(li, class_=celebrity)
    for m in movie_title:
        # movie_img = bf.findAll(‘div‘, class_=‘avatar‘)
        div_txt = m.findChild(div)
        url_movie = div_txt[style]
        url_mov = url_movie[22:-1]

        mov_img = requests.get(url_mov).content
        a_txt = m.findChild(a)
        name = a_txt[title]
        with open(path + "/" + title + "演员/" + name + .jpg, wb) as f:
            f.write(mov_img)
View Code

好了,本次的小分享就这样结束了

 

以上是关于python简单爬虫的主要内容,如果未能解决你的问题,请参考以下文章

爬虫遇到头疼的验证码?Python实战讲解弹窗处理和验证码识别

Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)(代码片段

[Python]python爬虫简单试用

5行python代码实现简单的网络爬虫

如何用最简单的Python爬虫采集整个网站

python 用于在终端中运行的sublime text 3的简单代码片段制作工具