学习笔记之爬虫案例

一、爬虫案例

1.1 豆瓣网

import os
from fake_useragent import UserAgent
import requests
from bs4 import BeautifulSoup
from urllib.request import urlretrieve
# 定义下载目录
download_path = "./douban"
# 如果不存在就创建
if not os.path.exists(download_path):	
    os.makedirs(download_path)

url = "https://book.douban.com/chart?subcat=F&icn=index-topchart-fiction//"
start_urls = []
def download_pic(url):
	# 应付反爬虫的,模拟浏览器访问
    ua = UserAgent()
 	# headers:用于伪装成浏览器访问,也可以在浏览器中打开“开发者工具”,找到NetWork查看
 	# 爬虫警告:418
    headers = {"User-Agent":ua.chrome}
    r = requests.get(url,headers=headers)
    # 解析HTML
    soup = BeautifulSoup(r.text,"lxml")
    content = soup.find("div",class_="article") # 大的div
    images = content.find_all("img") # 获取所有书籍封面的标签
    pic_lint_list = [image["src"] for image in images]
    #content = soup.find("h2",class_="clearfix") # 获取所有书籍封面的标签
    bookeNames = content.find_all("a",class_="fleft")  # 获取所有书籍封面的标签
    pic_bookName_list = [bookeName.text for bookeName in bookeNames]
    start_time = time.time()
    for link,name in zip(pic_lint_list,pic_bookName_list):
        # 下载方式一
        # urlretrieve:将文件下载到本地
        #urlretrieve(link,f"{download_path}/{name}.jpg")
        # 下载方法二
        html = requests.get(link)
        with open(f"{download_path}/{name}.jpg","wb") as f:
            f.write(html.content)
download_pic(url)

1.2 猫眼

from urllib import request
url = "https://piaofang.maoyan.com/getBoxList?date=1&isSplit=true"
url2 = "https://piaofang.maoyan.com/dashboard-ajax?orderType=0&uuid=178923d7718c8-054e74b56b98a6-c3f3568-1fa400-178923d7718c8&riskLevel=71&optimusCode=10&_token=eJyN0k1rwzAMBuD%2F4rOWWLYi24EeCoPRwQ4r3S5lB7fN0jLalCTsg7H%2FPtlpYcdBwE%2BM9GIr%2BVb9YqdqDeq96VWtsNAFK1DjoGpkdJatZWeIQW3%2F7JFB6wnUpn%2B%2BVfUaLVcQOLyknaVsrDEYDai9foGrSWxInlS1kCK1H8fzUJfl%2BRC713hqi2PsvuKp2HbHcheH%2FaaL%2FU4O86%2B68qPZ3OybOCrJP65SvkcH6TIePaBJkIMYzLBgXAaBNVdQRgDrE2wFNiQQXcAGKLd7BKoEQWuoUnuQds47ZMBlMINPXcEzhBSIWgeZg8uUcDQ60yGgTbGISIBEmZKDFWc6GR%2FnNvSSkOMRg1zK5VyjHaA3mShhniaysJoobX6qTd8i6IlWaNK83tK8ZI2Xdby%2BP8g%2FIbXDoT2JmvvP1VO7mM%2Fv2vnycTZTP7%2BqToXW"
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"
}
rq = request.Request(url2,headers=header)
res = request.urlopen(rq)
print(res.read().decode()) # 解码

1.3 别逗了笑话网

from urllib import request
from lxml import html
from bs4 import BeautifulSoup
import requests
import os

header = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"
}
url = "https://www.biedoul.com/"

# 创建文件保存目录
filePath = os.path.join('biedoul')
if not os.path.exists(filePath):
    os.makedirs(filePath) # 如果不存在则创建

# 获取当前页码:方法一
def GetPageNumOne(url,header):
    page = requests.get(url, headers=header).content.decode("utf-8")
    sel =html.fromstring(page)
    span = sel.xpath("//div/span/text()") # 根据html结构获取数据
    pageNum = span[0]
    return pageNum

# 获取当前页码:方法二
def GetPageNumTwo(url,header):
    r = requests.get(url, headers=header)
    soup = BeautifulSoup(r.text, "lxml")
    content = soup.find("div", class_="pagebar")  # 根据便签的class获取数据
    span = content.find("span")
    pageNum = span.text
    return pageNum

# 保存html文件
def GetFile(pageNum,stepNum = 4):
    # 获取前10也的url列表,这么写是为了复习一下之前学的知识
    # li = [f"https://www.biedoul.com/index/{i}" for i in range(pageNum-10, pageNum+1)]
    # for url in li:
    #     urlLen = len(url)
    #     fileName = f"{url[urlLen-stepNum::]}.html"
    #     request.urlretrieve(url, filePath+"/"+fileName)
    for i in range(pageNum-10, pageNum+1):
        url = f"https://www.biedoul.com/index/{i}"
        fileName = f"{i}.html"
        request.urlretrieve(url, filePath+"/"+fileName)

def main():
    pageNum1 = GetPageNumOne(url, header)
    pageNum2 = GetPageNumTwo(url, header)
    pageNum = int(pageNum1)
    stepNum = len(pageNum1)
    GetFile(pageNum)

if __name__ == '__main__':
    main()

1.4 豆瓣Top250

#--coding:utf-8--

import requests
from bs4 import BeautifulSoup
import time
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}

class IpSpider:
    def __init__(self):
        # 1. 准备需要爬取的页面的url
        self.page_urls = []
        for x in range(1, 10):
            page_url = 'https://www.kuaidaili.com/free/inha/{}/'.format(x)
            self.page_urls.append(page_url)

    def parse_page_urls(self, page_url):
        resp = requests.get(page_url, headers=headers)
        html = resp.text
        soup = BeautifulSoup(html, 'lxml')
        trs = soup.find('tbody').find_all('tr')
        infos = []
        for tr in trs:
            info = list(tr.stripped_strings)
            infos.append(info)
        return infos

    def run(self):
        with open("ip.csv", 'w', encoding='utf-8') as fp:
            fp.write('{},{},{},{},{},{},{}\n'.format('IP', 'PORT', '匿名度', '类型', '位置', '响应速度', '最后验证时间'))
            for page_url in self.page_urls:
                # 1. 爬取所有的页面的url
                print(page_url)
                time.sleep(1)
                infos = self.parse_page_urls(page_url)
                for info in infos:
                    fp.write('{},{},{},{},{},{},{}\n'.format(info[0], info[1], info[2], info[3], info[4], info[5], info[6]))

def main():
    spider = IpSpider()
    spider.run()

if __name__ == '__main__':
    main()

1.5 赶集网

import requests
import re

def parse_page(page_url):
    header = {
        'User - Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'
    }
    resp = requests.get(page_url, headers=header)
    html = resp.text
    houses = re.findall(r"""
        <div.+?ershoufang-list".+?<a.+?js-title.+?>(.+?)</a>.+?<!--官方核验码--> # 标题
        .+?<dd.+?<span>(.+?)</span> # 户型
        .+?<span.+?<span>(.+?)</span> # 面积
        .+?price.+?m">(.+?)</span> # 价格
    """, html, re.VERBOSE|re.DOTALL)
    for house in houses:
        print(house)


def main():
    base_url = "http://dl.ganji.com/zufang/pn{}/"
    for index in range(1, 11):
        page_url = base_url.format(index)
        parse_page(page_url)
        break

if __name__ == '__main__':
    main()

1.6 糗事百科

import requests
import re

def parse_page(page_url):
    req = requests.get(page_url)
    html = req.text
    rets = re.findall(r"""
        <div.+?content.+?<span>(.+?)</span>
    """, html, re.DOTALL|re.VERBOSE)

    for ret in rets:
        content = re.sub(" |\n|<br/>","", ret)
        print(content)
        print("-"*50)

def main():
    page_url = "https://www.qiushibaike.com/text/page/{}/"
    for i in range(1,11):
        new_url = page_url.format(i)
        parse_page(new_url)
        break

if __name__ == '__main__':
    main()

1.7 12306自动抢票

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException,ElementNotVisibleException
import csv
import time


# 9:商务座,M:一等座,O:二等座,3:硬卧,4:软卧,1:硬座
driver = webdriver.Chrome(executable_path="D://chromedriver.exe")
class TrainSpider(object):

    login_url = "https://kyfw.12306.cn/otn/resources/login.html"
    personal_url = "https://kyfw.12306.cn/otn/view/index.html"
    left_ticket_url = "https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc"
    confirm_passenger_url = "https://kyfw.12306.cn/otn/confirmPassenger/initDc"
    def __init__(self, from_station, to_station, train_date, trains, passengers):
        """

        :param from_station:起始站
        :param to_station:到达站
        :param train_date:乘车日期
        :param trains:需要购买的车次 {"G8041":["M","O"],"G701":["3","O"]}
        :param passengers:乘客

        """
        self.from_station = from_station
        self.to_station = to_station
        self.train_date = train_date
        self.trains = trains
        self.passengers = passengers
        self.selected_seat = None

        self.station_codes = {}
        self.init_station_code()


    def init_station_code(self):
        with open("stations.csv", "r", encoding="utf-8") as fp:
            reader = csv.DictReader(fp)
            for line in reader:
                name = line["name"]
                code = line["code"]
                self.station_codes[name] = code

    def login(self):
        driver.get(self.login_url)
        WebDriverWait(driver, 1000).until(
            EC.url_to_be(self.personal_url)
        )
        print("登录成功!")


    def search_left_ticket(self):
        driver.get(self.left_ticket_url)
        from_station_input = driver.find_element_by_id("fromStation")
        from_station_code = self.station_codes[self.from_station]
        driver.execute_script("arguments[0].value='%s'" % from_station_code, from_station_input)

        to_station_input = driver.find_element_by_id("toStation")
        to_station_code = self.station_codes[self.to_station]
        driver.execute_script("arguments[0].value='%s'" % to_station_code, to_station_input)

        train_date_input = driver.find_element_by_id("train_date")
        driver.execute_script("arguments[0].value='%s'" % self.train_date, train_date_input)

        time.sleep(5)

        search_btn = driver.find_element_by_id("query_ticket")
        search_btn.click()

        WebDriverWait(driver, 100).until(
            EC.presence_of_element_located((By.XPATH, "//tbody[@id='queryLeftTable']/tr"))
        )

        trains_trs = driver.find_elements(By.XPATH, "//tbody[@id='queryLeftTable']/tr[not(@datatran)]")
        for trains_tr in trains_trs:
            infos = trains_tr.text.replace("\n", " ").split(" ")
            number = infos[0]
            if number in self.trains:
                seattyps = self.trains[number]
                is_searched = False
                for seat_typ in seattyps:
                    if "O" == seat_typ:
                        count = infos[9]
                        if count.isdigit() or count == "有":
                            is_searched = True
                            self.selected_seat = seat_typ
                            break
                    if "M" == seat_typ:
                        count = infos[8]
                        if count.isdigit() or count == "有":
                            is_searched = True
                            self.selected_seat = seat_typ
                            break
                if is_searched:
                    self.selected_number = number
                    order_btn = trains_tr.find_element(By.XPATH, "//a[@class='btn72']")
                    order_btn.click()
                    break

    def confirm_passenges(self):
        # WebDriverWait(driver, 1000).until(
        #     EC.url_contains(self.confirm_passenger_url)
        # )
        WebDriverWait(driver, 1000).until(EC.url_to_be(self.confirm_passenger_url))

        # 先等待一下乘客标签显示出来了
        WebDriverWait(driver, 1000).until(
            EC.presence_of_element_located((By.XPATH, "//ul[@id='normal_passenger_id']/li/label"))
        )

        # 选择乘客
        passenger_labels = driver.find_elements(By.XPATH, "//ul[@id='normal_passenger_id']/li/label")
        for passenger_label in passenger_labels:
            name = passenger_label.text
            if name in self.passengers:

                passenger_label.click()

        # 选择座次
        Select(driver.find_element_by_id("seatType_1")).select_by_value(self.selected_seat)

        WebDriverWait(driver, 1000).until(
            EC.element_to_be_clickable((By.ID, "submitOrder_id"))
        )
        submit_btn = driver.find_element_by_id("submitOrder_id")
        submit_btn.click()

        WebDriverWait(driver, 1000).until(
            EC.element_to_be_clickable((By.ID, "qr_submit_id"))
        )
        submit_btn = driver.find_element_by_id("qr_submit_id")
        while submit_btn:
            try:
                submit_btn.click()
                submit_btn = driver.find_element_by_id("qr_submit_id")
            except ElementNotVisibleException:
                break
        print("恭喜!%s车次%s抢票成功!"%(self.selected_number, self.selected_seat))




    def run(self):
        # 登录
        self.login()
        # 查询余票
        self.search_left_ticket()
        # 确认乘车人和席位
        self.confirm_passenges()

def main():
    spider = TrainSpider("北京", "沈阳", "2021-05-13", {"G8075": ["O"]}, ["张飞"])
    spider.run()


if __name__ == '__main__':
    main()



1.8 实习僧网站字体反爬

import base64
import io
from fontTools.ttLib import TTFont
import requests
import re

# 从页面中获取font_face
font_face = "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"
# with open("实习僧.ttf", "wb") as fp:
#     fp.write(b)

# 进行base64解码
b = base64.b64decode(font_face)
# 读取解码后的字体,获得字体对象
baseFont = TTFont(io.BytesIO(b))
# baseFont.saveXML("实习僧.xml")

# 获取字体的样式
baseGlyf = baseFont["glyf"]
# 将样式与数字像对应
baseFontMap = {
    0: baseGlyf["uni30"],
    1: baseGlyf["uni31"],
    2: baseGlyf["uni32"],
    3: baseGlyf["uni33"],
    4: baseGlyf["uni34"],
    5: baseGlyf["uni35"],
    6: baseGlyf["uni36"],
    7: baseGlyf["uni37"],
    8: baseGlyf["uni38"],
    9: baseGlyf["uni39"],
}

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36",
    "Referer": "https://www.shixiseng.com/interns?keyword=Python&page=1&city=%E5%85%A8%E5%9B%BD&type=intern"
}
url = "https://www.shixiseng.com/intern/inn_fvaxgoojylnd?pcm=pc_SearchList"
resp = requests.get(url, headers=headers)
# 获取网页的源代码
text = resp.text

# 通过正则获取base64字体文件
result = re.search(r'base64,(.+?)"\)', text).group(1)
font_bytes = io.BytesIO(base64.b64decode(result))
currentFont = TTFont(font_bytes)

currentFontMap = currentFont.getBestCmap()
# 获取当前网页所有字体的形状
currentGlyf = currentFont["glyf"]
for code, name in currentFontMap.items():
    # 先获取到当前网页某个name下的形状
    currentShape = currentGlyf[name]
    # 循环内容和形状字典
    for number, baseShape in baseFontMap.items():
        # 判断循环获取到shape是否和当前的shape是否相当
        # 如果相当就找到code与内容的映射
        if currentShape == baseShape:
            webcode = str(hex(code)).replace("0", "&#", 1)
            # 将网页中的code值替换成数字
            text = re.sub(webcode, str(number), text)

with open("实习僧.html", "w", encoding="utf-8") as af:
    af.write(text)




待更新…

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值