python学习过程中的知识点,记录一下

一、安装munpy matplotlib库的问题

解决:在pycharm中的terminal中输入python -m pip install -U matplotlib进行安装
在这里插入图片描述
使用anaconda安装的时候,anaconda会自动装一个虚拟环境。 当你用pycharm时,环境选择了anaconda,那就以为在这个虚拟环境上工作了。 而你自己打开命令行直接安装,这个时候安装包不在anaconda的虚拟环境里。 就导致了pycharm找不到你安装的包。 就出现了问题。

二、中文显示问题

解决:py文件中加入下面的代码

import matplotlib.pyplot as plt
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']   # 单引号中是中英文的字体
plt.rcParams['axes.unicode_minus'] = False

三、正则表达的核心:搜索和匹配 搜索字符和匹配字符
正则表达是搜索引擎的基础

四、win10 下安装 neo4j

解决方案:1、先安装Java jdk
neo4j是用Java语言编写的图形数据库,运行时需要启动JVM进程,因此,需安装JAVA SE的JDK
链接:https://www.oracle.com/technetwork/java/javase/downloads/index.html
在这里插入图片描述

2、需要配置java的环境变量
环境变量如下设置:
在这里插入图片描述
系统变量如下设置:
在这里插入图片描述

1、安装好后cmd输入java -version检查是否安装好
(需要注意的是:此时需要进入到java安装的文件夹下,再输入命令java -version)
在这里插入图片描述

5、下载安装neo4j
链接: https://neo4j.com/download-center/#community
下载好后解压到自己想放的盘里,例如:F:\neo4j-community-3.4.0-rc02
Neo4j应用程序有如下主要的目录结构:
bin目录:用于存储Neo4j的可执行程序;
conf目录:用于控制Neo4j启动的配置文件;
data目录:用于存储核心数据库文件;
plugins目录:用于存储Neo4j的插件;

6、创建系统环境变量
创建主目录环境变量NEO4J_HOME,并把主目录设置为变量值
在这里插入图片描述
Path = %NEO4J_HOME%\bin
在这里插入图片描述
7、验证Neo4j的安装和环境变量配置是否成功
在这里插入图片描述
http://localhost:7474 默认跳转到 http://localhost:7474/browser
在这里插入图片描述
初始密码:neo4j 进去之后可以修改密码。
五、利用scrapy框架爬取网站信息
scrapy简单说明
scrapy 为一个框架
框架和第三方库的区别:
库可以直接拿来就用,
框架是用来运行,自动帮助开发人员做很多的事,我们只需要填写逻辑就好
命令:
创建一个 项目 :
cd 到需要创建工程的目录中,
scrapy startproject stock_spider
其中 stock_spider 为一个项目名称

创建一个爬虫
cd ./stock_spider/spiders
scrapy genspider tonghuashun “http://basic.10jqka.com.cn/600004/company.html”
其中 tonghuashun 为一个爬虫名称
“http://basic.10jqka.com.cn/600004/company.html” 为爬虫的地址

在项目中添加main.py的文件

from scrapy.cmdline import execute
import sys
import os
#  调试的写法
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
# 注意函数中的[]   "tonghuashun"是之前创建的py文件
execute(["scrapy", "crawl", "tonghuashun"])

爬取网站信息数据的时候会可能遇到网站的反爬取设置,出现的问题是
DEBUG: Crawled (403) 或者 INFO: Ignoring response <403
解决问题:数据网站设置反爬虫技术,主要原因是我们是直接Get请求数据,而浏览器的请求是有Header的。基于这一点,把请求伪装成浏览器请求,就可以解决这个问题了。
第一种方法:在settings.py文件中加上(有的时候爬取会说浏览器版本过低,换另一种就可以了)

USER_AGENT = 'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0'

第二种方法:是对于大量的数据访问要求,添加头文件

# coding=utf-8
import urllib2 as ulb
import numpy as np
import PIL.ImageFile as ImageFile
import cv2
import random
# 收集到的常用Header
my_headers = [
    "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36",
    "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/537.75.14",
    "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)",
    'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11',
    'Opera/9.25 (Windows NT 5.1; U; en)',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
    'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)',
    'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12',
    'Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9',
    "Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Ubuntu/11.04 Chromium/16.0.912.77 Chrome/16.0.912.77 Safari/535.7",
    "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0 "
]

# 用urllib2库链接网络图像
response = ulb.Request(url)
# 随机选择一个Header伪装成浏览器
response.add_header('User-Agent', random.choice(my_headers))

获得爬取内容后,为了方便直接调试网站信息是否被爬,直观检测是否成功,需要用scrapy shell
方法:在win+ r,cmd输入后切到命令行窗口,再进入到爬虫项目的文件夹下
再输入scrapy shell http://basic.10jqka.com.cn/600004/company.html'
即 scrapy shell + 被爬取的网站,后续操作如下
在这里插入图片描述

使用Scrapy爬取数据时,执行:

scrapy shell https://www.XXXX.com/e/1.html

报错:import win32api
ModuleNotFoundError: No module named ‘win32api’
解决办法:
是一个缺少依赖包的错误,只要给python装个库:pypiwin32。
pip install pypiwin32

在创建的scrapy框架中会生成很多py文件,不同文件的功能如下:
首先需要自己添加程序启动文件main.py

from scrapy.cmdline import execute
import sys
import os
#  调试的写法
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
# 注意函数中的[] "tonghuashun""stock"是创建的py文件,也是项目文件,位于spiders文件夹下
# execute(["scrapy", "crawl", "tonghuashun"])
execute(["scrapy", "crawl", "stock"])   # 启动"stock"程序

编写第一个爬虫(Spider)
Spider 是用户编写用于从单个网站(或者一些网站)爬取数据的类。包含以下三个属性:
name:用于区别 spider,该名字必须是唯一的。
start_urls:包含了 spider 在启动时进行爬取的 URL 列表。因此,第一个被获取到的页面将是其中之一。后续的 URL 则从初始的 URL 获取到的数据中提取。
parse() 是 spider 的一个方法。被调用时,每个初始 URL 完成下载后生成的 response 对象将会作为唯一的参数传递给该函数。该方法负责解析返回的数据(response data),提取数据(生成 item)以及生成需要进一步处理的 URL 的 Request 对象。
以下为豆瓣TOP250的 Spider 代码,保存在 doubanmovie/spiders 目录下的 doubanspider.py 文件中。
在这里插入图片描述

items.py:定义需要的item类
此文件下,是进行获得抓取的信息,即项目py文件中的变量。Item 是保存爬取到的数据的容器;其使用方法和 Python 字典类似,并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。
以豆瓣电影TOP250 https://movie.douban.com/top250 为例,我们需要抓取每一部电影的名字,电影的描述信息(包括导演、主演、电影类型等等),电影的评分,以及电影中最经典或者说脍炙人口的一句话。

pipelines.py:管道文件,传入items.py中的item类,清理数据,保存或入库
此文件下,是进行存储逻辑设置,对应与项目py文件中的存储语句
启用pipeline
为了让我们定义的pipeline生效,要在settings.py文件中,打开ITEM_PIPELINES注释:
ITEM_PIPELINES = {
‘spider_douban.pipelines.SpiderXXXXPipeline’: 300,
}
pipelines.py文件代码如下

# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
#See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
import csv
import os
# pipelines文件内容,定义数据存储的方式,此处定义数据存储的逻辑,
# 可以将数据存储载MySQL数据库,MongoDB数据库,文件,CSV,Excel等存储介质中,如下以存储载CSV为例:

    class MoviesSpiderPipeline(object):
        def process_item(self, item, spider):
            return item
    
class MoviesPipline(object):
    # 构造函数    类被加载时,执行此函数
    def __init__(self):
        self.file = open("douban_moviesinfo.csv", 'a+')  # 'a+'读写权限
def process_item(self, item, spider):
    # 判断文件是否为空
    # 文件不为空,就追加写
    if os.path.getsize("douban_moviesinfo.csv"):
        # 开始写文件 # 导入爬取信息  引用新的函数
        self.save_message(item)
    else:
        # # 输入开头的列表信息
        self.file.write("电影名字" + "," + "评分" + "," + "引用句子" + "," + "电影年份" + "," + "导演信息等"+"\n")  # 添加换行符防止数据存储在同一行

    # 解决数据写入文件不及时,需要每次写入都刷新
    self.file.flush()
    return item

def save_message(self, item):
    fullTitle = item['movie_title']
    movie_message = item['movie_message']
    movie_star = item['movie_star']
    movie_quote = item['movie_quote']
    movie_year = item['movie_year']
    movie_director = item['movie_director']

    result = ''
    for i in range(len(fullTitle)):
        result += fullTitle[i] + movie_star[i] + movie_quote[i] + movie_year[i] + movie_director[i] + movie_message[i] + '\n'
        self.file.write(result)

settings.py:设置文件,例如设置用户代理和初始下载延迟
此文件下,需要设置

#USER_AGENT = 'stock_spider (+http://www.yourdomain.com)'
USER_AGENT = 'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0'    # 防止网站有反爬虫设置

ITEM_PIPELINES = {
    'stock_spider.pipelines.StockSpiderPipeline': 300,
    # 下面的语句是对pipelines.py中的StockPipeline函数作用
    'stock_spider.pipelines.StockPipeline': 1,
}

Movies.py(项目文件)

# -*- coding: utf-8 -*-
import scrapy

import re
import requests
from bs4 import BeautifulSoup

from scrapy.http import Request
from scrapy.selector import Selector
from urllib.parse import urljoin
from movies_spider.items import DoubanmoviesItem   # 这里是项目下items.py中的类
import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb18030') #改变标准输出的默认编码

修改对返回页面与新增的URL爬取请求的处理,使其解析返回的信息

class MoviesSpider(scrapy.Spider):
    name = 'movies'
    allowed_domains = ['https://movie.douban.com/']
    #  设置初始链接为电影页面链接
    start_urls = ['https://movie.douban.com/top250']

    # 获取页面中信息代码并生成对应链接
    def parse(self, response):
        item = DoubanmoviesItem()
        selector = Selector(response)
        # 这个语句能直接爬取当前界面所有电影    直接按照属性查找,不容易定位错误
        Movies = selector.xpath("//div[@class=\"info\"]")
        for eachMovie in Movies:
            movie_title = eachMovie.xpath("div[@class=\"hd\"]/a/span/text()")[0].extract()
            fullTitle = "".join(movie_title)  # 将多个字符串无缝连接起来
            # 选取匹配元素  要把它的根找到,前面扩展的找  后面再缩小范围
            movie_info = eachMovie.xpath('div[@class=\"bd\"]/p/text()').extract()
            # 去除换行符 \n
            movie_message = [x.strip() for x in movie_info]
            # 去除list最后的空格
            movie_message.remove('')
            # 将list中需要的元素输出  需要用(.+?)这个符号,因为有的外国导演名字中间有个特殊字符·,其他的不匹配
            movie_director = re.findall("导演:(.+?)主演:", movie_message)
            # movie_director = re.findall('导演:(\w+?)主演: ', movie_message[0])
            
            # 要把它的根找到,前面扩展的找 'div[@class=\"star\"]/text()'
            movie_star =eachMovie.xpath('div[@class=\"bd\"]/div[@class=\"star\"]/span/text()')[0].extract()
            # 前面扩展的找 后面再缩小范围  【0】就会输出为一个元素,不选择就是list
            movie_quote = eachMovie.xpath('div[@class=\"bd\"]/p[@class=\"quote\"]/span[@class=\"inq\"]/text()').extract()
            movie_year = movie_message[1]
            
            # 匹配数字,得到list元素中的年份
            movie_year = re.findall("\d+", movie_year)
            
            if movie_quote:  # quote可能是空的,所以要判断一下
                movie_quote = movie_quote[0]
            else:
                movie_quote = ''           
            print("电影名称:", movie_title)
            print("电影信息:", movie_message)
            print("导演:", movie_director)
            print("电影评分和名句:", movie_star)
            print("引用的句子:", movie_quote)
            print("电影年份:", movie_year)
            print("********************************************************")
            item = DoubanmoviesItem()
            item['movie_title'] = fullTitle
            item['movie_message'] = movie_message
            item['movie_star'] = movie_star
            item['movie_quote'] = movie_quote
            item['movie_year'] = movie_year
            item['movie_director'] = movie_director
            yield item  # yield相当于return   传递到pipelines.py文件中,为了写入抓取数据到csv等文件

        # 爬取完第一页之后换到后面的页数继续爬取
        next_page = selector.xpath("//span[@class=\"next\"]/link/@href").extract()
        print(next_page)  # 下一页的添加链接
        # 第10页是最后一页,没有下一页的链接

        # 另一种思路
        # "//div[@class=\"paginator\"]/a/@href"   最后的/a/@href   不要写作 /a[@href],就不会输出多余的字符串
        next_page = selector.xpath("//div[@class=\"paginator\"]/a/@href").extract()
        print(next_page)
        for i in range(len(next_page)):
            next_url = 'https://movie.douban.com/top250' + next_page[i]
            print("输出所有250部电影界面链接:", next_url)
            # dont_filter=True 这句需要加上,否则进不去循环
            yield scrapy.Request(urljoin(response.url, next_url), callback=self.parse, dont_filter=True)
        
        # nextLink = selector.xpath('//span[@class="next"]/link/@href').extract()
        # # 第10页是最后一页,没有下一页的链接
        # if nextLink:
        #     nextLink = nextLink[0]
        #     yield Request(urljoin(response.url, nextLink), callback=self.parse)
        # 解析下一页的规则,取的后一页的xpath
        # next_link = response.xpath("//span[@class='next']/link/@href").extract()
        # if next_link:
        #     next_link = next_link[0]
        #     yield scrapy.Request("https://movie.douban.com/top250" + next_link, callback=self.parse())

stock.py: 自己创建的项目名称
Tonghuashun.py:自己创建的项目名称

Items.py:获得抓取的信息,即stock.py中的变量信息
pipelines.py:存储逻辑设置

settings.py: 爬取网站信息设置
Csv文件:爬取信息后导入生成的数据文件
Main.py:自己添加的启动程序

安装TuShare模块
方式1:pip install tushare
方式2:访问https://pypi.python.org/pypi/tushare/下载安装
方式3:将源代码下载到本地python setup.py install

# Tushare是一个免费、开源的python财经数据接口包。主要实现对股票等金融数据从数据采集、清洗加工 到 数据存储的过程
import tushare as ts
# 获得股票行业信息
df = ts.get_industry_classified()
# 把返回的信息直接存储在 “stock_industry_prep.csv”
df.to_csv("stock_industry_prep.csv")
# 获得股票概念信息,并存储在 “stock_concept_prep.csv”文件

df = ts.get_concept_classified()
df.to_csv("stock_concept_prep.csv")
保存为csv格式
import tushare as ts
df = ts.get_hist_data('000875')#直接保存
df.to_csv('c:/day/000875.csv')#选择保存
df.to_csv('c:/day/000875.csv',columns=['open','high','low','close'])
保存为Excel格式
df = ts.get_hist_data('000875')#直接保存
df.to_excel('c:/day/000875.xlsx')#设定数据位置(从第3行,第6列开始插入数据)
df.to_excel('c:/day/000875.xlsx', startrow=2,startcol=5)
保存为HDF5文件格式
df = ts.get_hist_data('000875')
df.to_hdf('c:/day/hdf.h5','000875')
保存为JSON格式
df = ts.get_hist_data('000875')
df.to_json('c:/day/000875.json',orient='records')

爬取过程中遇到的问题:
解决UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xbb’ in position
解决方法:在抓取网页上面的一些源代码的时候,将uft-8的编码写入文档,并输出的时候,出现这了这个报错,说gbk无法编码\xbb
查找相关资料:
1.str转bytes叫encode,bytes转str叫decode
2.字符就是unicode字符,字符串就是unicode字符数组
原来,print(),write()函数的默认编码不是utf-8,修改编码方式即可
在创建的项目py文件中添加代码:

import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb18030') #改变标准输出的默认编码

问题:pycharm读取csv文件乱码的问题
解决方法:因为pycharm中默认设置是以utf-8的编码方式打开文件,而csv的文件正确读取方式是GBK,使用UTF-8自然会造成乱码
在pycharm的settings选项中修改File Encodings选项文件格式改为GBK
Editor ——> File Encodings ——> Project Encoding

问题:1 yield Request(url=parse.urljoin(response.url, p_url),callback=self.parse_detail)
回调函数不执行:
加上:
dont_filter=True参数
yield Request(url=parse.urljoin(response.url, p_url),callback=self.parse_detail,dont_filter=True)

程序文件运行顺序:
Main.py(启动爬虫程序)–>items.py(声明将要抓取的变量)–>stock.py()–>pipelines.py(创建Tushare数据包文件,和新的csv空文件)–>stock.py(循环抓取信息)–>pipelines.py(将抓取信息写入CSV文件)

/  从根节点来进行选择元素
body/div   选取属于body的子元素中的所有div元素

//  从匹配选择的当前节点来对文档中的节点进行选择
//div      选取所有 div标签的子元素,而不管他们在html文档中的位置

@     选择属性
@lang    选取名称为lang的所有属性

.     选取当前节点
..    选取当前节点的父节点

通配符
*   匹配任何元素节点
@*  匹配任何属性节点

//*    选取文档中的所有元素
//title[@*]   选取所有带有属性的title元素

\    路径表达式中,代表的是 和  的关系
//body/div \ //body/li     选取所有body元素下面所有的div和li的元素

元字符
.    匹配除换行符以外的任意字符
\w   匹配字母或者数字或者下划线或者汉字
\s   匹配任意的空白符
\d   匹配数字
\b   匹配单词的开始或者结束的位置
^    匹配字符串的开始
$    匹配字符串的结束

反义代码
\W   匹配 不是 字母或者数字或者下划线或者汉字
\S   匹配任意 不是 空白符
\D   匹配 不是 数字
\B   匹配 不是 单词的开始或者结束的位置

[^a]  匹配不是a的字符
[^asdf] 匹配不是asdf的字符


限定符
*  重复零次或多次
+  重复一次或多次
? 重复零次或一次
{n}   重复n次
{n,}  重复n次或者更多次数
{n,m}  重复n到m次
"""
贪婪:    尽可能多的匹配
非贪婪:  尽可能少的匹配
非贪婪操作符:?
这个操作符是用在* + ?后面的,要求正则匹配的越少越好
* 代表重复零次或更多次   加上?代表匹配零次
+ 重复一次或更多次       加上?代表匹配一次    
?重复零次或一次         加上?代表匹配零次
"""
'''
加r和不加''r是有区别的
'r'是防止字符转义的 如果路径中出现'\t'的话 不加r的话\t就会被转义 而加了'r'之后'\t'就能保留原有的样子
在字符串赋值的时候 前面加'r'可以防止字符串在时候的时候不被转义 原理是在转义字符前加'\'
例:
s=r'\tt'
print(s)
Output:
'\tt'
 
s='\tt'
print(s)
Output:
'        t'
在Python的string前面加上‘r’, 是为了告诉编译器这个string是个raw string,不要转意backslash '\' 。 
例如:\n 在raw string中,是两个字符,\和n, 而不会转意为换行符。由于正则表达式和 \ 会有冲突,
因此,当一个字符串使用了正则表达式后,最好在前面加上'r'。
'''

六、知识图谱的练习
贪心学院第二个主题项目-知识图谱 - 慎言的文章 - 知乎 https://zhuanlan.zhihu.com/p/77966750

导入csv
https://neo4j.com/docs/cypher-manual/current/clauses/load-csv/#load-csv-import-data-from-a-csv-file

中文乱码问题
导入的时候出现了中文乱码问题,解决方法如下:
把你的csv文件用记事本打开,然后另存为的时候,编码方式选为UTF-8即可
问题:程序中出现中文,运行的时候出现如下错误:
SyntaxError: Non-UTF-8 code starting with ‘\xc1’ in file C:…\xxx.py
解决方法:
在程序最上面加上:# coding=gbk

发布了50 篇原创文章 · 获赞 9 · 访问量 2108

猜你喜欢

转载自blog.csdn.net/weixin_42118531/article/details/101080095
今日推荐