2024-08-23



import requests
import re
 
def login_to_tianyancha(username, password):
    # 登录接口URL
    login_url = 'https://passport.tianyancha.com/login'
    session = requests.session()
 
    # 获取登录时需要的加密参数
    result = session.get(login_url)
    execution = re.search('"execution":"(.*?)"', result.text).group(1)
    _event_id = re.search('_event_id:"(.*?)"', result.text).group(1)
 
    # 登录数据
    login_data = {
        'username': username,
        'password': password,
        'execution': execution,
        '_event_id': _event_id,
        'lt': ''
    }
 
    # 发送登录请求
    login_response = session.post(login_url, data=login_data)
 
    # 登录成功后,获取token
    token = re.search('"token":"(.*?)"', login_response.text).group(1)
    print(f'登录成功,获取到的token: {token}')
    return token, session
 
# 使用示例
username = 'your_username'
password = 'your_password'
token, session = login_to_tianyancha(username, password)

在这段代码中,我们首先定义了一个函数login_to_tianyancha,它接受用户名和密码作为参数,使用requests库来管理会话,并通过正则表达式解析登录页面中的关键参数。然后,我们构建登录数据并发送POST请求进行登录。登录成功后,我们再次使用正则表达式提取token。最后,我们返回token和包含登录状态的会话对象。

2024-08-23



import requests
from bs4 import BeautifulSoup
import pandas as pd
import matplotlib.pyplot as plt
 
# 请求URL获取页面内容
def get_page(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
    response = requests.get(url, headers=headers)
    return response.text
 
# 解析页面数据
def parse_data(html):
    soup = BeautifulSoup(html, 'lxml')
    movie_list = soup.find_all('div', class_='info')
    for movie in movie_list:
        yield {
            '排名': movie.find('em').text,
            '电影名': movie.find('span', class_='title').text,
            '评分': movie.find('rating_num').text,
            '评分人数': movie.find('span', class_='rating_people').text[3:-3]
        }
 
# 保存数据到CSV
def save_to_csv(data, filename):
    df = pd.DataFrame(data)
    df.to_csv(filename + '.csv', index=False, encoding='utf-8-sig')
 
# 绘制电影评分的直方图
def plot_histogram(data):
    ratings = data['评分'].str.extract(r'(\d+\.?\d*)').astype('float')
    plt.hist(ratings, bins=25, color='lightblue', edgecolor='black')
    plt.xlabel('评分')
    plt.ylabel('电影数')
    plt.title('豆瓣电影评分直方图')
    plt.show()
 
# 主函数
def main():
    url = 'https://movie.douban.com/chart'
    html = get_page(url)
    movie_data = list(parse_data(html))
    save_to_csv(movie_data, 'douban_movies')
    plot_histogram(pd.DataFrame(movie_data))
 
if __name__ == '__main__':
    main()

这段代码实现了从豆瓣电影排行榜网页爬取数据,并将数据保存到CSV文件,最后使用matplotlib绘制电影评分的直方图。代码使用了requests库来发送HTTP请求,BeautifulSoup库来解析页面,pandas库来处理数据,以及matplotlib库来绘图。

2024-08-23



from drission.dr import *
from drission.web.chrome import *
from drission.web.auth_proxy import *
 
# 设置代理服务器
proxy_server = 'http://localhost:8010'
 
# 初始化DrissionPage
dr = DrissionPage(Chrome())
 
# 设置代理插件
dr.set_auth_proxy(AuthProxy(proxy_server))
 
# 设置代理认证信息
dr.auth_proxy.set_auth_info(
    user='your_username',
    password='your_password',
    domain='your_domain',
    host='your_proxy_host'
)
 
# 访问目标网站
dr.get('https://your_target_website.com')
 
# 执行数据采集操作
# ...
 
# 关闭浏览器
dr.close()

这段代码展示了如何使用DrissionPage和AuthProxy插件来配置和使用代理服务器进行数据采集。首先,我们设置了代理服务器的URL。然后,我们初始化了DrissionPage,并设置了代理插件。接着,我们设置了代理认证所需的用户名、密码、域、代理服务器地址。最后,我们使用DrissionPage访问了目标网站,并执行了数据采集操作。最终,我们关闭了浏览器以释放资源。

2024-08-23



import requests
from bs4 import BeautifulSoup
 
def crawl_lagou_jobs(position, city, page_num):
    """
    爬取拉勾网的职位信息
    :param position: 职位名称
    :param city: 城市名称
    :param page_num: 页数
    :return: 职位信息列表
    """
    jobs_info = []
    for i in range(1, page_num+1):
        url = f'https://www.lagou.com/jobs/list_%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E6%8A%80%E5%91%98?city={city}&district=&positionName={position}&first=true&kd=e1f8c6b136364c89977c5539f8b84833'
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
        }
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            soup = BeautifulSoup(response.text, 'lxml')
            job_list = soup.find_all('div', class_='job-primary')
            for job in job_list:
                job_info = {
                    'company_name': job.find('div', class_='company-name').text,
                    'position_name': job.find('div', class_='name').text.strip(),
                    'salary': job.find('div', class_='money').text.strip(),
                    'work_year': job.find('div', class_='work-year').text.strip(),
                    'education': job.find('div', class_='eduBackground').text.strip(),
                    'city': job.find('div', class_='work-location').text.strip(),
                }
                jobs_info.append(job_info)
        else:
            print(f'请求失败,状态码:{response.status_code}')
    return jobs_info
 
# 使用示例
position = '机器学习工程师'
city = '北京'
page_num = 3
jobs_info = crawl_lagou_jobs(position, city, page_num)
for info in jobs_info:
    print(info)

这段代码定义了一个crawl_lagou_jobs函数,它接受职位名称、城市名称和页数作为参数,返回拉勾网上该职位的信息列表。这个简易的网络爬虫示例展示了如何使用Python进行网页爬取,并提取出有价值的数据。

2024-08-23

由于原始链接已经提供了完整的代码,我们只需要提取关键部分,以下是一个简化的代码实例,用于演示如何使用Python爬取西安工业大学OJ上的题目文档:




import requests
from bs4 import BeautifulSoup
 
# 西安工业大学OJ的网址
oj_url = "http://noj.xidian.edu.cn/"
 
# 使用requests获取网页内容
response = requests.get(oj_url)
 
# 检查请求是否成功
if response.status_code == 200:
    # 使用BeautifulSoup解析网页
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # 假设题目列表在一个特定的<div>中,这里需要根据实际情况调整CSS选择器
    problem_div = soup.find('div', class_='problem-list')
    
    # 遍历所有的<a>标签,提取题目名称和链接
    for a_tag in problem_div.find_all('a'):
        problem_name = a_tag.text
        problem_link = oj_url + a_tag['href']
        print(f"题目名称: {problem_name}, 链接: {problem_link}")
        # 这里可以添加代码来下载题目文档
else:
    print("网页请求失败")

这段代码演示了如何使用requests和BeautifulSoup库来获取网页内容,并解析出需要的信息。在实际应用中,你可能需要处理登录验证、处理分页、处理复杂的DOM结构等问题,但基本的爬虫框架就是这样的。

2024-08-23



import requests
from lxml import etree
import pandas as pd
 
def crawl_zhi_net(query, start_year, end_year, save_path):
    # 知网文献信息的容器
    data = []
 
    for year in range(start_year, end_year + 1):
        print(f"正在爬取 {query} {year} 年的文献信息...")
        url = f"https://www.zhihu.com/question/29134642/answer/101174968?sort=created"
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"}
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            html = etree.HTML(response.text)
            # 解析并提取文献信息
            for item in html.xpath('//div[@class="zm-editable"]/ul/li'):
                title = item.xpath('./a/text()')[0]
                link = item.xpath('./a/@href')[0]
                data.append({'year': year, 'title': title, 'link': link})
 
    # 保存为CSV文件
    df = pd.DataFrame(data)
    df.to_csv(save_path, index=False)
    print(f"文献信息已保存至 {save_path}")
 
# 使用示例
crawl_zhi_net("机器学习", 2010, 2020, "MachineLearning_papers_2010-2020.csv")

这段代码首先定义了一个函数crawl_zhi_net,输入参数包括查询词、开始和结束年份以及保存路径。函数通过循环遍历每一年,并构造知网URL来发送请求,解析响应内容,提取文献信息,并将其存储在一个列表中。最后,使用Pandas库将文献信息转换为DataFrame并保存为CSV文件。这个过程展示了如何使用Python爬取动态网页内容,并进行数据解析和存储的基本方法。

2024-08-23



import hashlib
 
def md5_encrypt(data, salt):
    """
    使用MD5和盐对数据进行加密
    :param data: 待加密的数据
    :param salt: 盐
    :return: 加密后的数据
    """
    md5 = hashlib.md5()
    md5.update(data.encode('utf-8'))
    md5.update(salt.encode('utf-8'))
    return md5.hexdigest()
 
# 示例使用
data = "my_data"
salt = "my_salt"
encrypted_data = md5_encrypt(data, salt)
print(f"加密后的数据: {encrypted_data}")

这段代码定义了一个md5_encrypt函数,它接受两个参数:data(待加密的数据)和salt(盐),然后使用MD5算法和盐对数据进行加密,并返回加密后的结果。在示例使用中,我们定义了待加密的数据和盐,调用md5_encrypt函数并打印出加密后的数据。

2024-08-23

由于原始代码已经提供了一个很好的示例,这里我们将以一个简化的例子来说明如何使用execjs在Python中执行JavaScript代码。

假设我们有一个简单的JavaScript函数,它接受两个数字作为参数,并返回它们的和:




function add(a, b) {
    return a + b;
}

我们可以使用execjs模块在Python中执行这个函数:




import execjs
 
# 假设你已经安装了Node.js,因为execjs需要一个JavaScript运行时环境
# 创建JavaScript运行环境
context = execjs.create_context()
 
# 读取JavaScript代码并在环境中运行
with open('add.js', 'r') as file:
    js_code = file.read()
context.eval(js_code)
 
# 使用JavaScript函数
result = context.call('add', 3, 4)
print(result)  # 应该输出7

确保你已经安装了execjs库,可以使用pip安装:




pip install PyExecJS

如果系统中没有安装Node.js,execjs会尝试使用其他JavaScript运行时(如PhantomJS),但从execjs 1.5.0版本开始,建议安装Node.js。

2024-08-23

为了提高Python爬虫的效率和稳定性,可以采取以下几种策略:

  1. 异步IO:使用asyncio库和aiohttp库实现异步网络请求,这样可以并发处理多个请求,而不是逐个顺序等待。
  2. 分布式爬虫:使用Scrapy分布式框架,可以通过多台机器或服务器并行抓取同一网站,大大提高爬取速度。
  3. 请求头部优化:为每个请求随机设置User-Agent、Referer等头部信息,避免被服务器识别为爬虫。
  4. 代理和IP池:使用代理和IP池,可以避免单一IP被封禁的风险,提高爬取效率。
  5. 设置合理的请求间隔:遵守网站的robots.txt协议,设置合理的请求间隔,避免对网站造成过大压力。
  6. 异常处理:对网络异常和爬取异常进行捕获和处理,避免爬虫程序意外中断。

以下是一个简单的异步爬虫示例代码:




import asyncio
import aiohttp
 
async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()
 
async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'http://example.com')
        print(html)
 
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

这段代码使用aiohttp库以异步方式获取了指定URL的内容。通过异步IO,可以显著提高爬取效率。

2024-08-23

以下是一个简化的Python爬虫代码示例,用于从中国大学MOOC网站上爬取课程信息,并将其保存到CSV文件中。




import requests
import csv
from bs4 import BeautifulSoup
 
def get_courses_data(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    courses = soup.find_all('div', class_='course-card-container')
    courses_data = []
    for course in courses:
        title = course.find('div', class_='title').text
        level = course.find('div', class_='level').text
        num_students_str = course.find('div', class_='num-students').text
        num_students = int(num_students_str.replace(',', '').split()[0])
        courses_data.append((title, level, num_students))
    return courses_data
 
def save_to_csv(data, filename):
    with open(filename, 'w', newline='', encoding='utf-8') as file:
        writer = csv.writer(file)
        writer.writerow(['Title', 'Level', 'Number of Students'])
        writer.writerows(data)
 
# 示例URL
url = 'https://www.icourse163.org/course/0809-023925?from=searchPage'
courses_data = get_courses_data(url)
save_to_csv(courses_data, 'courses_data.csv')

这段代码首先定义了一个函数get_courses_data,它接受一个URL作为参数,发送HTTP请求,解析响应内容,并提取课程信息。然后定义了另一个函数save_to_csv,它将数据保存到CSV文件中。最后,使用一个示例URL调用了这两个函数,获取数据并保存。

请注意,由于爬取行为可能违反中国大学MOOC的使用条款,因此在未经允许的情况下,不应使用此代码进行爬取。此外,网站的HTML结构可能会发生变化,因此解析代码可能需要定期更新以保持其有效性。