Datawhale爬虫组队学习Task 01

一、认识爬虫

爬虫:一段自动抓取互联网信息的程序,即从互联网中的一个URL出发,访问它所能达到的所有URL,并且获取到需要的价值数据。

二、必备网页基础知识

  • HTML :构建整个网页骨架
  • CSS :美化网页
  • JavaScript :赋予网页灵魂(动)
  • HTML DOM:定义了所有 HTML 元素的对象和属性,以及访问它们的方法

三、爬虫基本步骤

  1. 发送请求
  2. 获取响应内容
  3. 解析内容
  4. 保存数据

四、Request库

作用:自动爬取HTML页面;自动网络请求提交

4.1 Requests请求方式:get与post

1.get():获取HTML网页的主要方法,对应于HTTP的GET,可以直接请求打开

公式:requests.get(url,headers=?,params=?,**kwargs)

2.post():向HTML网页提交POST请求的方法,对应于HTTP的POST,其请求参数在请求体中,消息长度没有限制且以隐式的方式进行发送。

公式:requests.post(url,data=?,headers=?,json=?,**kwargs)

4.2 Requests的两个重要对象

在这里插入图片描述request:构造一个向服务器请求资源的Request对象
请求方式:GRT 和POST
请求URL:统一资源定位符
请求头:包含请求头部信息,比如:User-Agent
请求体:请求额外携带的数据

response:返回一个包含服务器资源的Response对象
Response对象包含服务器返回的所有信息,也包含请求的Request信息

五、Request库的基本应用

5.1 爬取python之禅 (requests.get的应用)

import requests
url = 'https://www.python.org/dev/peps/pep-0020/'
res = requests.get(url)
text = res.text
text

可以看到返回的其实就是开发者工具下Elements的内容,只不过是字符串类型,接下来我们要用python的内置函数find来定位“python之禅”的索引,然后从这段字符串中取出它

通过观察网站,我们可以发现这段话在一个特殊的容器中,通过审查元素,使用快捷键Ctrl+shift+c快速定位到这段话也可以发现这段话包围在pre标签中,因此我们可以由这个特定用find函数找出具体内容

## 爬取python之禅并存入txt文件
with open('zon_of_python.txt', 'w') as f:
    f.write(text[text.find('<pre')+28:text.find('</pre>')-1])
print(text[text.find('<pre')+28:text.find('</pre>')-1])

利用python自带的urllib完成以上操作:

import urllib
url = 'https://www.python.org/dev/peps/pep-0020/'
res = urllib.request.urlopen(url).read().decode('utf-8')
print(res[res.find('<pre')+28:res.find('</pre>')-1])

5.2 金山词霸 (requests.post的应用)

import requests
def translate(word):
    url="http://fy.iciba.com/ajax.php?a=fy"

    data={
        'f': 'auto',
        't': 'auto',
        'w': word,
    }
    
    headers={
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
    }#User-Agent会告诉网站服务器,访问者是通过什么工具来请求的,如果是爬虫请求,一般会拒绝,如果是用户浏览器,就会应答。
    response = requests.post(url,data=data,headers=headers)     #发起请求
    json_data=response.json()   #获取json数据
    #print(json_data)
    return json_data
    
def run(word):    
    result = translate(word)['content']['out']   
    print(result)
    return result

def main():
    with open('zon_of_python.txt') as f:
        zh = [run(word) for word in f]

    with open('zon_of_python_zh-CN.txt', 'w') as g:
        for i in zh:
            g.write(i + '\n')
            
if __name__ == '__main__':
    main()

5.3 进阶:爬取豆瓣电影

import requests
import os

if not os.path.exists('image'):
     os.mkdir('image')

def parse_html(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"}
    res = requests.get(url, headers=headers)
    text = res.text
    item = []
    for i in range(25):
        text = text[text.find('alt')+3:]
        item.append(extract(text))
    return item
       
def extract(text):
    text = text.split('"')
    name = text[1]
    image = text[3]
    return name, image

def write_movies_file(item, stars):
    print(item)
    with open('douban_film.txt','a',encoding='utf-8') as f:
        f.write('排名:%d\t电影名:%s\n' % (stars, item[0]))
    r = requests.get(item[1])
    with open('image/' + str(item[0]) + '.jpg', 'wb') as f:
        f.write(r.content)
        
def main():
    stars = 1
    for offset in range(0, 250, 25):
        url = 'https://movie.douban.com/top250?start=' + str(offset) +'&filter='
        for item in parse_html(url):
            write_movies_file(item, stars)
            stars += 1

if __name__ == '__main__':
    main()

在这里插入图片描述用urllib.request爬取的电影名及其基本信息:

import urllib.request
import bs4
#伪装成浏览器访问
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
                        "Chrome/70.0.3538.110 Safari/537.36"}
def get_page(url):
    request = urllib.request.Request(url, headers=headers)
    response = urllib.request.urlopen(request)
    html = response.read().decode("utf-8")
    return html

def parse_html(html):
    soup = bs4.BeautifulSoup(html, "lxml")
    movies_lists_soup = soup.find("ol", attrs={"class": "grid_view"})
    movies_list_soup = movies_lists_soup.find_all("li")
    for movies_soup in movies_list_soup:
        movie_name = movies_soup.find('span', attrs={"class": 'title'}).text
        movie_star = movies_soup.find('p').text
        print(movie_name, end=" ")
        print(movie_star)


def main():
    i = 0
    while i < 10:
        url = "https://movie.douban.com/top250?start=" + str(i * 25) + "&filter="
        html = get_page(url)
        data = parse_html(html)
        i += 1

if __name__ == '__main__':
    main()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值