Python 爬虫例子

学了几天的语法,今天终于开始实战-爬虫,心情有点小激动
本人看的教程主要是:
廖雪峰的Python博客 大家看了都说好
小甲鱼的Python视频教程
小甲鱼的视频都很经典,将的挺有意思,风趣,时不时讲讲荤段子,泡妹纸技巧(滑稽脸),之前看过对应的“C语言入门视频”,“数据结构和算法”都讲的很好,想看的直接百度即可

一. Python 调用网易云翻译进行字符串的翻译

参考博客
这个例子,在小甲鱼的视频里面也讲到了,有心人可以取去我提供的视频里面找

# -*- coding:utf-8 -*-
import  urllib.request
import  urllib.parse
import  json

def transalate(str):
    url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"     # 有道 云翻译内部访问的地址
    From_Data = {}
    From_Data['i']=str
    From_Data['from']='AUTO'
    From_Data['to']='AUTO'
    From_Data['smartresult']='dict'
    From_Data['client']='fanyideskweb'
    From_Data['salt']='1525344419877'
    From_Data['sign']='721bbfed345b0d955d8691221ed2b1e1'
    From_Data['doctype']='json'
    From_Data['version']='2.1'
    From_Data['keyfrom']='fanyi.web'
    From_Data['action']='FY_BY_REALTIME'
    From_Data['typoResult']='false'

    data = urllib.parse.urlencode(From_Data).encode('utf-8')       # 当字符串数据以url的形式传递给web服务器时,字符串中是不允许出现空格和特殊字符,因此我们需要转化格式
    # print(data)
    response = urllib.request.urlopen(url,data)     # 传递数据的形式,Get 方式访问
    html = response.read().decode('utf-8')
    # print(html)
    jsondata = json.loads(html)
    return jsondata['translateResult'][0][0]['tgt']         # 返回最终需要的数据(翻译的结果)

str = input("输入你想翻译的文字:")
result = transalate(str)
print(result)       

如果报“{“errorCode”:50}” ,可以在把
Request URL:http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
将translate_o?中的_o去掉即可

二. 爬取猫眼电影 top10

1.每个电影 Item

# -*- coding:utf-8 -*-
class MovieItem(object):
    def __init__(self,rank ,name,stars ,time ,img_url):
        self.rank = rank
        self.name = name
        self.stars = stars
        self.time = time
        self.img_url = img_url

    def __str__(self):
        return str( self.rank)+" "+self.name+" "+str(self.stars)+" "+self.img_url+" " + str(self.time)

2. 主要的爬虫代码

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

import requests

from com.maoyan.Item import MovieItem
from com.maoyan.Item import Stu

url = "http://maoyan.com/board/4?offset=0"


def get_main_content(html):
    patstr = '(<dd>.*?class="board-index.*?</dd>)'

    pattern = re.compile(patstr,re.S)

    dd_list = pattern.findall(string=html)

    itemlist = []

    for d in dd_list:       # 拿到每个页面的 dd 标签
        itemlist.append(d)  # 将每个电影的 dd 标签放到 list 中

    return itemlist

def parse_itemlist(itemlist):

    # 采用贪婪方式匹配每个 dd 标签内容,后取分组信息
    parstr = '.*?<i class="board-index.*?>(.*?)</i>.*?<img src="(.*?)".*?<p class="name".*?<a.*?>(.*?)</a>.*?<p class="star">(.*?)</p.*?class="releasetime">(.*?)</p>.*?'

    # re.S 表示匹配所有的字符串,包括换行符 
    pattern = re.compile(parstr,re.S)

    itemList = []

    for elem in itemlist:
        m = pattern.match(elem)         # 得到匹配对象, 取分组
        rank = m.group(1)
        img_url = m.group(2)
        name = m.group(3)
        stars = m.group(4)
        stars =stars.strip()    # 去掉首尾的空字符
        time = m.group(5)
        item = MovieItem(rank,name,stars,time,img_url)

        itemList.append(item)

    return itemList

def get_html(url):
    headers={
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
    }
    response = requests.get(url,headers=headers)
    return response.text


if __name__ == "__main__":
    # self, rank, name, stars, time, img_url):
    html = get_html(url)            # 拿到网页的源码
    # print(html)
    itemlist = get_main_content(html)   # 拿到每个 dd 标签, 并封装到 list 中
    itemList = parse_itemlist(itemlist)            # 得到了每个 item 对象并封装到 list 中
    for elem in itemList:
        print(elem)

结果

1 霸王别姬 主演:张国荣,张丰毅,巩俐 //ms0.meituan.net/mywww/image/loading_2.e3d934bf.png 上映时间:1993-01-01
2 肖申克的救赎 主演:蒂姆·罗宾斯,摩根·弗里曼,鲍勃·冈顿 //ms0.meituan.net/mywww/image/loading_2.e3d934bf.png 上映时间:1994-10-14(美国)
3 罗马假日 主演:格利高里·派克,奥黛丽·赫本,埃迪·艾伯特 //ms0.meituan.net/mywww/image/loading_2.e3d934bf.png 上映时间:1953-09-02(美国)
4 这个杀手不太冷 主演:让·雷诺,加里·奥德曼,娜塔莉·波特曼 //ms0.meituan.net/mywww/image/loading_2.e3d934bf.png 上映时间:1994-09-14(法国)
5 教父 主演:马龙·白兰度,阿尔·帕西诺,詹姆斯·肯恩 //ms0.meituan.net/mywww/image/loading_2.e3d934bf.png 上映时间:1972-03-24(美国)
6 泰坦尼克号 主演:莱昂纳多·迪卡普里奥,凯特·温丝莱特,比利·赞恩 //ms0.meituan.net/mywww/image/loading_2.e3d934bf.png 上映时间:1998-04-03
7 唐伯虎点秋香 主演:周星驰,巩俐,郑佩佩 //ms0.meituan.net/mywww/image/loading_2.e3d934bf.png 上映时间:1993-07-01(中国香港)
8 千与千寻 主演:柊瑠美,入野自由,夏木真理 //ms0.meituan.net/mywww/image/loading_2.e3d934bf.png 上映时间:2001-07-20(日本)
9 魂断蓝桥 主演:费雯·丽,罗伯特·泰勒,露塞尔·沃特森 //ms0.meituan.net/mywww/image/loading_2.e3d934bf.png 上映时间:1940-05-17(美国)
10 乱世佳人 主演:费雯·丽,克拉克·盖博,奥利维娅·德哈维兰 //ms0.meituan.net/mywww/image/loading_2.e3d934bf.png 上映时间:1939-12-15(美国)

三. selenium 天猫信息

操作:在天猫搜索框输入“手机”,获取手机的“页数”

# -*-coding:utf-8 -*-
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver


url = "http://www.tianmao.com"
browser = webdriver.Chrome()
wait = WebDriverWait(browser, 3)

# 键入手机,得到手机的分页总数
# 共80页,到第页 确定
def search():

    try:
        browser.get(url)                                            # 键入淘宝首页
        input = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "#mq"))          # 直到能定位到这个元素
        )
        # input.send_keys(Keys.ENTER)                               # 在输入框中键入回车
        submit = wait.until(                                        # 直到加载该元素后,定义该元素
            EC.element_to_be_clickable((By.CSS_SELECTOR, "#mallSearch > form > fieldset > div > button"))
        )

        input.send_keys("手机")                   # 向输入框中输入信息
        submit.click()                            # 点击查询按钮 , 会跳到另一个页面

        # 下面的操作是在另个页面操作
        total = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "#content > div > div.ui-page > div > b.ui-page-skip > form"))
        )

        return total.text
    except TimeoutException:
        return search()
    finally:
        pass

def main():
    result = search()
    print(result)

if __name__=="__main__":
    main()

四、爬取百度翻译(手机版)

# -*-coding:utf-8 -*-
import json
import sys

import requests


class FanYi(object):
    def __init__(self, string):
        self.lang_detect_url = 'https://fanyi.baidu.com/langdetect'
        self.translate_url = 'https://fanyi.baidu.com/basetrans'
        self.headers = {
            'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Mobile Safari/537.36'
        }
        self.string = string

    def get_request_result(self, url, data):
        response = requests.post(url, data, headers=self.headers)
        # 返回 json 格式的数据
        return json.loads(response.content.decode())

    def run(self):
        # 首先请求得到待文字的类型(中文/英文)在翻译的 url 中需要
        string = self.string
        data = {
            'query':string
        }
        # 得到请求翻译的文字的类型
        lang = self.get_request_result(self.lang_detect_url,data)['lan']

        # 请求翻译结果
        from_lang = 'zh'        # 假设默认是 中 -》 英
        to_lang = 'en'

        if lang=='en':      # 如果请求的文字是英文,则更换请求参数
            from_lang = 'en'
            to_lang = 'zh'

        translate_data = {
            'query': string,
            'from': from_lang,
            'to': to_lang
        }

        result = self.get_request_result(self.translate_url,data=translate_data)['trans'][0]['dst']
        print(result)

def main():
    #表示从键盘录入待翻译的文字
    string = sys.argv[1]
    # fy = FanYi(string)
    fy = FanYi(string)
    fy.run()

if __name__ == '__main__':
    main()
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值