1. selenium語法
"""__author__= 雍新有"""
from selenium import webdriver
# 模擬調用不同的瀏覽器
# webdriver.Chrome()
# webdriver.Firefox()
# webdriver.PhantomJS()
# webdriver.Safari()
# webdriver.Opera()
broswer = webdriver.Chrome()
broswer.get('http://www.taobao.com')
2. xpath語法
"""__author__= 雍新有"""
"""
使用xpath解析源碼
"""
from lxml import etree
html = '''
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<ul>
<li class="class1"><a href="class1.html">1</a></li>
<li class="class2"><a href="class2.html">2</a></li>
<li class="class3"><a href="class3.htl">3</a></li>
<li class="class4"><a href="class4.html">4</a></li>
<li class="class5"><a href="class5.html">5</a></li>
<li>
<ul>
<li class="class1"><a href="class6.html">6</a></li>
<li class="ass7"><a href="class7.html">7</a></li>
<li class="class8"><a href="class8.html">8</a></li>
</ul>
</li>
</ul>
<div>
</body>
</html>
'''
# soup = BeautifulSoup(html, 'lxml')
tree = etree.HTML(html)
# 拿到整個html的內容卖宠,只不過是一個對象 '/'表示從根節(jié)點去獲取元素
a1 = tree.xpath('/html')
print(a1)
# '//'從任何一個位置上獲取元素
a2 = tree.xpath('//ul')
print(a2)
a3 = tree.xpath('/html/body/div/ul')
print(a3)
a4 = tree.xpath('/html/body/div/ul/li/ul')
print(a4)
for item in a4:
# '.'表示當前位置蜡吧,此處鼎姊,表示ul的位置
print(item.xpath('./li/a'))
# '@'獲取屬性
print(item.xpath('./li/a/@href'))
# text()表示獲取標簽內的信息
print(item.xpath('./li/a/text()'))
# //* -- 從任何一個位置去找所有類名為class1的標簽
a5 = tree.xpath('//*[@class="class1"]')
print(a5)
for item in a5:
print(item.xpath('./a/text()'), item.xpath('./a/@href'))
3. mongodb
3.1 mongodb語法
查看數據庫: show dbs
創(chuàng)建數據庫: db.createCollection('maoyan')
使用: use maoyan
MongoDB中的概念:數據庫(類似mysql中的數據庫)枯夜、
集合(類似mysql中的表)究履、
文檔(不用定義表結構,直接記錄數據)
注意: 集合可不用自己創(chuàng)建埠褪,向集合中插入數據時,集合會自動創(chuàng)建
db.集合名.insert() ===> db.user.insert({'name': 'whf'})
db.集合名.save()
db.集合名.find() 查詢集合內的文檔信息
db.集合名.find({}) 查詢集合內的文檔信息
show collections 查詢集合
db.集合名.drop() 刪除集合 -- 刪除表
db.user(集合名).remove({'name': 'li4'}) (條件) -- 刪除集合中的文檔(刪除一條記錄)
db.user.update({'name': 'zhang3'}, {'$set':{'age': 20}}) -- 修改字段
3.2 mongodb數據庫連接
"""__author__= 雍新有"""
"""
使用pymongo
"""
import pymongo
# 獲取客戶端
client = pymongo.MongoClient(host='47.100.164.252', port=27017)
# 獲取數據庫
db = client['spider']
def execute_movie(data):
db['douban'].insert(data)
if __name__ == '__main__':
data = {'title': '一出好戲', 'rate': '9.0'}
execute_movie(data)
4. 豆瓣電影爬取
- json接口
- mongdb存儲
"""__author__= 雍新有"""
import json
from db_helper import execute_movie
"""
爬取豆瓣電影型将,進行存儲(采用mongodb) - 爬接口而不是直接爬頁面數據
"""
import requests
def get_html(url):
# request中默認user-agent為python=requests/版本
# urllib中默認user-agent為python-urllib/版本
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36'
}
try:
response = requests.get(url, headers=headers)
# loads()將json格式數據轉化成dict
# dumps()將dict轉化成json格式數據
data = json.loads(response.text)
return data
except Exception as e:
print('IP異常,請切換IP')
# TODO:從ip代理池獲取一個有效代理
proxies = {
'http': 'http://183.129.207.78:18118'
}
response = requests.get(url, headers=headers, proxies=proxies)
# loads()將json格式數據轉化成dict
# dumps()將dict轉化成json格式數據
data = json.loads(response.text)
return data
if __name__ == '__main__':
# 分類地址
tag_url = 'https://movie.douban.com/j/search_tags?type=movie&source='
# 獲取電影信息地址
movie_url = 'https://movie.douban.com/j/search_subjects?type=movie&tag={tag}&sort=recommend&page_limit=20&page_start={start}'
# 獲取分類接口返回信息
result = get_html(tag_url)
for tag in result['tags']:
for i in range(20):
real_url = movie_url.format(tag=tag, start=i*20)
# 獲取到的是電影信息
result_movie = get_html(real_url)
print(result_movie['subjects'])
data = result_movie['subjects']
if len(data):
# 接口返回電影信息存在荐虐,則保持
for item in data:
# item為每一個電影的信息七兜,使用mongdb存儲
# 使用pymongo進行存儲數據
execute_movie(data)
else:
# 接口返回電影信息不存在,則跳出當前循環(huán)
break
5. 爬取u17最熱
- 用的本地mongdb
- post請求
"""__author__= 雍新有"""
import pymongo
import requests
import json
client = pymongo.MongoClient(host='127.0.0.1', port=27017)
db = client['spider']
def get_html(url, data):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36',
}
response = requests.post(url, headers=headers, data=data)
result = json.loads(response.text)
return result
def save_mongo(data):
for item in data:
db['u17'].insert_one(item)
def main():
post_url = 'http://www.u17.com/comic/ajax.php?mod=comic_list&act=comic_list_new_fun&a=get_comic_list'
comic_url = 'http://www.u17.com/comic/{comic_id}.html'
for i in range(1, 6):
data = {
'data[group_id]': 'no',
'data[theme_id]': 'no',
'data[is_vip]': 'no',
'data[accredit]': '2',
'data[color]': 'no',
'data[comic_type]': 'no',
'data[series_status]': 'no',
'data[order]': '1',
'data[page_num]': str(i),
'data[read_mode]': 'no',
}
json = get_html(post_url, data)
real_result = []
for item in json['comic_list']:
data = {
'real_url': comic_url.format(comic_id=item['comic_id']),
'name': item['name'],
'img': item['cover'],
'type': item['line1'],
}
real_result.append(data)
print(real_result)
save_mongo(real_result)
if __name__ == '__main__':
main()