学了几天的语法,今天终于开始实战-爬虫,心情有点小激动
本人看的教程主要是:
廖雪峰的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()