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(美国)

3. 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()

猜你喜欢

转载自blog.csdn.net/hi_bigguy/article/details/80586462
今日推荐