暑假学习 Python爬虫基础(1)

这个暑假发生的事情太多了,感觉自己浑浑噩噩的浪费了许多时间,那么就要用后面的时间补回来

 

在暑假阶段的爬虫学习目标就是能够独立的实现一些基本简单的爬虫

下面来进行一下一些环境的准备,因为我以前学过一些简单的,但是有因为没有恒心就放弃了

 

Fiddler进行手机抓包

首先要在配置好fiddler的环境,就先在电脑上实验一下啊

在配置环境的过程中,设置好fiddler允许远程连接之后要重启一次fiddler手机才可以访问

然后就是苹果手机的描述文件要在设置里面安装一次就行了

接下来的部分就没有什么问题了

 

下面就是一些基础知识了

一个比较重要的库就是urllib   他有四个模块  

request  它是用来发起请求的

error  进行异常处理的

parse 解析url地址的

robotparse 解析网站的robot.txt

 

urllib中的urlopen方法

urllib(url,data=None,[timeout,]*) --请求链接,请求携带参数(比如post提交的数据,)请求超时时间

下面来进行一下简单的应用,来模拟一下登录一个山寨网站

值得注意的点就是使用https的话可以使用ssl未经验证上下文

context = ssl._create_unverified_context

数据封装转换成byte

data = bytes(parse.urlencode(dict),'utf-8')

 

此次的项目是在b站上爬取你想要的相关数据

from selenium import webdriver
from selenium.common.exceptions import TimeoutException  #一条命令在足够的时间里没有完成则抛出异常
from selenium.webdriver.common.by import By #支持的定位器分类
from selenium.webdriver.support.ui import WebDriverWait #等待页面加载完成,找到某个条件后再继续执行后续代码,如果超过设置时间的话检测不到则抛出异常
from selenium.webdriver.support import expected_conditions as EC #判断元素是否加载
from bs4 import BeautifulSoup
import xlwt

#https://www.cnblogs.com/cany/p/10897618.html

driver = webdriver.Chrome()
Wait = WebDriverWait(driver,10)

book = xlwt.Workbook(encoding='utf-8',style_compression=0)

sheet = book.add_sheet('蔡徐坤篮球',cell_overwrite_ok=True) #添加一张工作表, cell_overwrite_ok = True 时就可以覆盖单元格中的数据

sheet.write(0,0,"名称")
sheet.write(0,1,"地址")
sheet.write(0,2,"描述")
sheet.write(0,3,"观看次数")
sheet.write(0,4,"发布时间")
sheet.write(0,5,"弹幕数")

n=1

def search():
    try:
        print("开始访问b站。。。")
        driver.get("https://www.bilibili.com/")
        index = Wait.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="primary_menu"]/ul/li[1]/a')))
        index.click()


        input = Wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#banner_link > div > div > form > input")))
        summit= Wait.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="banner_link"]/div/div/form/button')))

        input.send_keys('蔡徐坤 篮球')
        summit.click()

        print("跳转到新的窗口")
        all_h = driver.window_handles  #获取所有窗口句柄
        driver.switch_to.window(all_h[1]) #switch_to.window标签页跳转
        get_source()

        total = Wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#server-search-app > div.contain > div.body-contain > div > div.page-wrap > div > ul > li.page-item.last > button')))
        return int(total.text)
    except TimeoutException:
        return search()

def next_page(page_num):
    try:
        print("获取下一页数据")
        next_btn = Wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#server-search-app > div.contain > div.body-contain > div > div.page-wrap > div > ul > li.page-item.next > button')))
        next_btn.click()
        Wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#server-search-app > div.contain > div.body-contain > div > div.page-wrap > div > ul > li.page-item.active > button'),str(page_num))) #判断某个元素中的text是否包含了预期的字符串
        get_source()
    except TimeoutException:
        driver.refresh()  
        return next_page(page_num)

def get_source():
    Wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#server-search-app > div.contain > div.body-contain > div > div.result-wrap.clearfix')))
    Html = driver.page_source
    soup = BeautifulSoup(Html,'lxml')
    save_to_excel(soup)

def save_to_excel(soup):
    list = soup.find(class_ = 'all-contain').find_all(class_ = 'info')
    for items  in list:
        item_title = items.find('a').get('title')
        item_link = items.find('a').get('href')
        item_dec = items.find(class_='des hide').text
        item_view = items.find(class_="so-icon watch-num").text
        item_data = items.find(class_ = 'so-icon time').text
        item_biubiu = items.find(class_ = 'so-icon hide').text

        print("爬取。。。"+ item_title)

        global n

        sheet.write(n,0,item_title)
        sheet.write(n,1,item_link)
        sheet.write(n,2,item_dec)
        sheet.write(n,3,item_view)
        sheet.write(n,4,item_data)
        sheet.write(n,5,item_biubiu)

        n = n+1

def main():
    try:
        total = search()
        print(total)
        for i in range(2,int(total+1)):
            next_page(i)

    finally:
        driver.close()

if __name__ == '__main__':
    main()
    book.save(u'蔡徐坤篮球.xls') #在字符串前加r,声明为raw字符串,这样就不会处理其中的转义了。否则,可能会报错


 

你可能感兴趣的:(Python爬虫)