爬虫案例 --- Python 爬取淘宝数据存到数据库

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

1)PHP语言 

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

2)Java 语言

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

3)C/C++语言

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

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

 

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!要使用Python进行航空案例的爬虫工作,您可以遵循以下步骤: 1. 导入所需的库:通常我们会使用requests库发送HTTP请求,并使用BeautifulSoup库解析HTML页面。确保您已经安装了这两个库。 2. 发送HTTP请求:使用requests库发送GET或POST请求来获取要爬取的网页内容。您可以使用URL库构建完整的URL。 3. 解析页面内容:使用BeautifulSoup库解析HTML页面,以便从中提取所需的数据。您可以使用标签、类、ID等选择器来定位特定的元素。 4. 提取数据:根据页面结构和内容,使用BeautifulSoup库提取所需的数据。您可以将数据存储在变量中,或将其保存到文件或数据库中。 5. 循环爬取:如果要爬取多个网页,您可以使用循环来遍历每个网页,并重复执行步骤2到4。 这里是一个简单的示例代码,用于爬取航空案例中的航班信息: ```python import requests from bs4 import BeautifulSoup def crawl_flights(): url = "https://example.com/flights" # 替换为实际的网页URL # 发送HTTP请求 response = requests.get(url) # 解析页面内容 soup = BeautifulSoup(response.text, "html.parser") # 提取数据 flights = [] flight_elements = soup.find_all("div", class_="flight") for flight_element in flight_elements: flight_info = {} flight_info["flight_number"] = flight_element.find("span", class_="number").text flight_info["departure"] = flight_element.find("span", class_="departure").text flight_info["arrival"] = flight_element.find("span", class_="arrival").text flights.append(flight_info) return flights # 测试爬虫 flights = crawl_flights() for flight in flights: print(flight) ``` 请注意,这只是一个示例,您需要根据实际的航空案例网页结构和数据提取需求进行相应的修改。另外,爬取网页时请尊重网站的使用政策,并确保遵守相关法律法规。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值