您的位置:首页 > 编程语言 > Python开发

为什么爬虫用python?( 爬取淘宝存到数据库 )

2018-05-12 00:09 295 查看

可以做爬虫的语言有很多,如 PHP、Java、C/C++、Python等等...

1)PHP语言 

虽然是世界上最好的语言 ,但是他天生不是干这个的,而且对多线程、异步支持不够好,并发处理能力很弱。爬虫是工具性程序,对速度和效率要求比较高。

2)Java 语言

的网络爬虫生态圈也很完善,是Python爬虫最大的对手 但是Java语言本身很笨重,代码量很大。  重构成本比较高,任何修改都会导致代码的大量变动。爬虫经常需要修改部分采集代码。

3)C/C++语言

运行效率和性能几乎最强,但是学习成本很高,代码成型比较慢,是很慢 。  能用C/C++做爬虫,只能说是能力的表现,但是不是正确的选择。

4)Python 语言

语法优美、代码简洁、开发效率高、支持的模块多,相关的HTTP请求模块和HTML解析模块非常丰富。 还有强大的爬虫Scrapy框架,以及成熟高效的 scrapy-redis分布式策略。而且,调用其他接口也非常方便(胶水语言)

在此对于各语言爬虫代码就不一一比较了...

来爬一下淘宝吧
import re
import pymongo
from config import *
from selenium import webdriver
from bs4 import  BeautifulSoup
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.PhantomJS(service_args=SERVICE_ARGS)
wait = WebDriverWait(driver, 10)
driver.set_window_size(width=1360, height=768)

def search():
print('正在搜素...')
try:
driver.get('https://www.taobao.com/')
# 设置加载时间,
input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#q"))
)
# 输入框
input.send_keys('美食')
# 获取搜索点击按钮
submit = driver.find_element_by_css_selector('#J_TSearchForm > div.search-button > button')
# 点击搜索
submit.click()
# 获取页数
total_page_num = driver.find_element_by_css_selector('#mainsrp-pager > div > div > div > div.total').text
total_num = re.compile('(\d+)').search(total_page_num).group(1)
# 获取页面详情
get_products()
return int(total_num)
except TimeoutException:
return search()

# 获取下页
def next_page(page_number):
print('正在翻页%s', page_number)
try:
input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input"))
)
# 输入框
input.clear()
input.send_keys(page_number)
# 获取搜索点击按钮
submit = driver.find_element_by_css_selector('#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')
# 点击搜索
submit.click()
# 根据高亮判断翻页是否成功
wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > ul > li.item.active > span'), str(page_number)))
# 获取页面详情
get_products()
except TimeoutException:
return next_page(page_number)

# 解析页面
def get_products():
# 判断元素是否已经加载下来
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')))
page = driver.page_source
# print(page)
html = BeautifulSoup(page, 'lxml')
items = html.select('#mainsrp-itemlist .items .item')
print(len(items))
for item in items:
# 商品图片连接,第一种连接
image = item.select('img')[0].attrs['data-src']
if not image :
# 第二种链接
image = item.select('img')[0].attrs['data-ks-lazyload']

# 封装写入mongodb
product = {
'image': 'https:'+image,
'price': item.select('.price')[0].text.strip().replace('¥', ''),
'product_url': item.select('.J_ClickStat')[0].attrs['data-href'], # 物品的连接
'sel_num': item.select('.deal-cnt')[0].text[:-3],
'title':item.select('.title')[0].text.strip(),
'location': item.select('.location')[0].text.strip(),
'shop': item.select('.shop')[0].text.strip(),
}
# print(product)
save_to_mongo(product)

# 写入mongo
def save_to_mongo(result):
try:
client = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB]
try:
if db[MONGO_TABLE].insert(result):
print('写入数据库成功', result)
except Exception:
print('写入mongod失败!!')
except Exception:
print('连接mongo失败!')

def main():

try:
total_page_num = search()
for i in range(2, total_page_num+1):
next_page(i)
except Exception as e:
print(e)
finally:
driver.close()

if __name__ == '__main__':
main()

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐